SQL Server использовать EXEC / sp_executesql или просто SQL в хранимой процедуре? - PullRequest
3 голосов
/ 27 августа 2011

У меня есть простое sproc, каков наилучший способ его кодирования для лучшего кэширования / оптимизации запросов?

В настоящее время у меня это выглядит следующим образом.построить SQL-запрос в виде строки и запустить с sp_executesql и передать параметр?Я спрашиваю из-за кэширования запросов и параметра, который я использую.

Спасибо!Тим

1 Ответ

2 голосов
/ 27 августа 2011

Не вижу смысла использовать динамический SQL здесь.Когда вам нужно нужно использовать динамический SQL, вам следует рассмотреть предпочтение sp_executesql выше, чем EXEC().Существует множество причин, в том числе:

  1. sp_executesql более вероятно повторное использование планов запросов (см. Динамический SQL - EXEC (@SQL) и EXEC SP_EXECUTESQL (@SQL)) );

  2. гораздо проще передавать строго типизированные параметры в sp_executesql (мешает внедрение SQL лучше, чем конкатенация строки);и

  3. вы также можете получить переменные из динамической области SQL обратно в область вызова, например:

DECLARE @i INT, @sql NVARCHAR(MAX), @dbname SYSNAME = N'model';

SET @sql = N'SELECT @i = COUNT(*) FROM ' 
    + @dbname + '.sys.tables;' 

EXEC sp_executesql @sql, N'@i INT OUTPUT', @i = @i OUTPUT;

PRINT @i;

Это не очень полезный пример, но это распространенная проблема при выполнении динамических строк.Но более важно то, что динамический SQL следует рассматривать только тогда, когда это необходимо, а не в качестве первого средства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...