exec в хранимой процедуре получит преимущества хранимой процедуры - PullRequest
3 голосов
/ 04 октября 2011

если я добавлю что-то

DECLARE @Query VARCHAR(8000)

SET @Query = 'select * from  subscriber   
                where sbs_userid = ' + cast(@UserID as varchar) + '
          and SBS_Status in (select statusFlag from #tmpStatusFlag) 
          and SBS_SourceFlag  in (select sourceFlag from #tmpSourceFlag)' 

IF (@FirstName !='')
    SET @Query = @Query + ' and  SBS_FirstName like ''%' + @FirstName + '%'''
IF(@LastName !='')
   SET @Query = @Query + ' and  SBS_LastName like ''%' + @LastName + '%'''
IF(@Phone !='')
   SET @Query = @Query + ' and  SBS_WorkPhone like ''%' + @Phone + '%'''
IF(@EmaiAdderess !='')
   SET @Query = @Query + ' and  SBS_EmailAddress like ''%' + @EmaiAdderess + '%'''
 IF(@City !='')
   SET @Query = @Query + ' and  SBS_City like ''%' + @City + '%'''   
IF(@SubListId !='-1')
   SET @Query = @Query + ' and  SBS_SubListId like ''%' + @SubListId + '%'''


SET @Query = @Query + ' order by SBS_CreationDate desc'

EXEC (@Query)

в мою хранимую процедуру.

мой вопрос, я все еще получаю преимущества хранимой процедуры, или это неправильный подход

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

РЕДАКТИРОВАНИЕ

ЕСЛИ мы используем sp_executesql вместо exec , тогда мы можем воспользоваться преимуществами хранимыхпроцедура. и это нормально с этим?

1 Ответ

4 голосов
/ 04 октября 2011

Нет.

. Вам нужно будет использовать EXEC sp_executesql, чтобы получить преимущества параметризации (повторное использование плана - защита от внедрения SQL).

Эти передовые символыпоиск карт в любом случае будет дорогим.Рассматривали ли вы полнотекстовое индексирование?

После редактирования

Если мы используем sp_executesql вместо exec, тогда мы можем воспользоваться преимуществами хранимой процедуры. И это нормально?с этим?

Не все преимущества хранимых процедур.Пара преимуществ, которые хранимые процедуры по-прежнему будут иметь над sp_executesql, заключаются в том, что вы можете использовать цепочку владения и получать только права доступа exec для хранимой процедуры, а не select для базовых объектов.Кроме того, наличие статических хранимых процедур вместо динамических строк SQL может упростить поиск зависимых объектов при рефакторинге базы данных.

Однако в вашем случае вам потребуется 64 отдельных процедуры для каждой комбинации присутствия / отсутствия для 6 необязательныхпараметров, и это число растет в геометрической прогрессии по мере добавления дополнительных параметров.

См. Условия динамического поиска в версии T-SQL для SQL 2005 и более ранних версиях для подробного обсуждения этой темы.

...