2016-09-01 2 views
0

Я все еще учусь SQL и не может понять разницу между этими 2, как показано ниже:SQL Server хранимые процедуры с или без выходного параметра

Подход № 1:

create proc sp_test1 
    @count int out, 
    @SalePrice int 
as 
begin 
    SELECT @Count = COUNT(*) 
    FROM dbo.SalesHistory 
    WHERE SalePrice = @SalePrice; 
end 

declare @Count int; 

exec sp_test1 @SalePrice = '967', @Count = @Count output; 

select @Count; 

Подход № 2:

create proc sp_test2 
    @SalePrice int 
as 
begin 
    SELECT COUNT(*) 
    FROM dbo.SalesHistory 
    WHERE SalePrice = @SalePrice; 
end 

exec sp_test2 @SalePrice = '967'; 

Оба должны вернуть число. Но в чем разница между этими двумя? В каком сценарии я использую каждый? Спасибо вам, ребята!

+0

Примечание: вы не должны ** использовать префикс 'sp_' для ваших хранимых процедур. Microsoft [зарезервировала этот префикс для собственного использования (см. * Именование сохраненных процедур *)] (http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx) и вы рискуете столкнуться с именем когда-нибудь в будущем. [Это также плохо для производительности вашей хранимой процедуры] (http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix). Лучше просто просто избегать 'sp_' и использовать что-то еще в качестве префикса - или никакого префикса вообще! –

+0

@marc_s Извините, я должен был поставить имя схемы до «sp_test1». Спасибо за напоминание. –

ответ

1

В этом случае нет никакой практической разницы и нет реальной причины для выполнения дополнительной работы для создания выходного параметра.

Примером того, где выходной параметр был бы полезен, является ситуация, когда набор данных возвращается из хранимой процедуры, но вы также нуждаетесь в едином фрагменте информации, который применяется ко всему набору ... например, возможно вам нужно точное время выполнения SQL Server запроса. Или, может быть, есть несколько таких предметов. Вы можете вернуть их в виде отдельных наборов данных «SELECT ...», но это может быть беспорядочным и не столь ясным в коде приложения, что возвращается. Вместо того, чтобы указывать выходные параметры, вы имели бы только индексированные таблицы. Таким образом, это было бы разумным местом для рассмотрения использования выходных параметров.

Параметры вывода никогда не требуются, но они могут быть хорошей возможностью возвращать скалярные данные вызывающему приложению.

+0

Большое спасибо! –

0

Обе процедуры аналогичны, но приложение может быть другим, например, предположим, что вы создаете веб-страницу, и есть сетка. когда мы размещаем сетку, мы подкарабиваем набор данных, а конечный пользователь должен знать, сколько пейджеров там. в таких случаях вы можете использовать вторую реализацию.

Реализация кулака очень проста, вы просто выбираете набор данных из базы данных.

Последнее, что я хотел бы выделить Выходные параметры являются необязательными.

+0

Вы имели в виду, что второй из них прямолинейный? –

+0

Мне жаль, что это не второе его первое утверждение – Prabhakantha

Смежные вопросы