Назвіть плюси та мінуси реального світу виконання динамічної команди SQL у збереженій процедурі на SQL Server із використанням
EXEC (@SQL)
проти
EXEC SP_EXECUTESQL @SQL
?
Назвіть плюси та мінуси реального світу виконання динамічної команди SQL у збереженій процедурі на SQL Server із використанням
EXEC (@SQL)
проти
EXEC SP_EXECUTESQL @SQL
?
Відповіді:
sp_executesql
більше шансів сприяти повторному використанню плану запитів. При використанні sp_executesql
параметри явно ідентифікуються в підписі виклику. Ця чудова стаття описує цей процес .
Часто цитується посилання на багато аспектів динамічного sql: Ерланд Соммарського повинен читати: " Прокляття та благословення динамічного SQL ".
Найважливіше в SP_EXECUTESQL - це те, що він дозволяє створювати параметризовані запити, що дуже добре, якщо ви дбаєте про ін'єкцію SQL.
Стаття Microsoft Використання sp_executesql статті рекомендує використовувати sp_executesql
замість execute
оператора.
Оскільки ця збережена процедура підтримує підстановку параметрів , sp_executesql є більш універсальним, ніж EXECUTE; і оскільки sp_executesql генерує плани виконання, які, швидше за все, будуть використані SQL Server, sp_executesql є більш ефективним, ніж EXECUTE.
Отже, take away: Не використовуйте execute
оператор . Використовуйте sp_executesql
.
sp_executesql
їх не можна було замінити execute
. Можливо, я повинен зазначити, що я намагаюся наголосити так: Використовуйте sp_executesql
замість того, execute
коли це можливо .
Я завжди використовую sp_executesql в наші дні, все це насправді є обгорткою для EXEC, яка обробляє параметри та змінні.
Однак не забувайте про OPTION RECOMPILE під час налаштування запитів на дуже великих базах даних, особливо там, де у вас є дані, що охоплюються більш ніж однією базою даних, і ви використовуєте CONSTRAINT для обмеження сканування індексів.
Якщо ви не використовуєте OPTION RECOMPILE, SQL-сервер намагатиметься створити план виконання "один розмір, який відповідає всім", і виконуватиме повне сканування індексу щоразу, коли він запускається.
Це набагато менш ефективно, ніж пошук, а це означає, що потенційно сканує цілі індекси, обмежені діапазонами, про які ви навіть не запитуєте: @
виконати команду
declare @sql varchar (100)
set @sql ='select * from #td1'
if (@IsMonday+@IsTuesday !='')
begin
set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )'
end
exec( @sql)
int
в динамічному SQL. Зауважте, що @sql оголошено як varchar
абоnvarchar