Не вижу смысла использовать динамический SQL здесь.Когда вам нужно нужно использовать динамический SQL, вам следует рассмотреть предпочтение sp_executesql
выше, чем EXEC()
.Существует множество причин, в том числе:
sp_executesql
более вероятно повторное использование планов запросов (см. Динамический SQL - EXEC (@SQL) и EXEC SP_EXECUTESQL (@SQL)) );
гораздо проще передавать строго типизированные параметры в sp_executesql
(мешает внедрение SQL лучше, чем конкатенация строки);и
вы также можете получить переменные из динамической области 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 следует рассматривать только тогда, когда это необходимо, а не в качестве первого средства.