Динамический SQL - вызова exec(@SQL) в сравнении с старпомов СП функции executesql(@SQL с)
каковы реальные плюсы и минусы выполнения динамической команды SQL в хранимой процедуре в SQL Server с помощью
EXEC (@SQL)
и
EXEC SP_EXECUTESQL @SQL
?
5 ответов:
sp_executesql
более вероятно, чтобы способствовать повторному использованию плана запроса. При использованииsp_executesql
, параметры явно определены в сигнатуре вызова. Эта отличная статья описывает это
большая вещь о ей что она позволяет создавать параметризованные запросы, что очень хорошо, если вы заботитесь о SQL-инъекции.
Microsoft С помощью процедуры sp_executesql статьи рекомендует использовать
sp_executesql
вместоexecute
заявление.потому что эта хранимая процедура поддерживает замена параметра, sp_executesql является более универсальным, чем EXECUTE; и потому, что sp_executesql создает планы выполнения, которые с большей вероятностью будут повторно используется SQL Server, sp_executesql является более эффективным!--11--> чем выполнить.
Итак, забираем: не используйте
execute
сообщении. Используйтеsp_executesql
.
Я бы всегда использовал sp_executesql в эти дни, все это действительно является оболочкой для EXEC, которая обрабатывает параметры и переменные.
однако не забывайте о опции перекомпиляции при настройке запросов на очень больших базах данных, особенно если у вас есть данные, охватывающие более одной базы данных, и вы используете ограничение для ограничения сканирования индекса.
Если вы не используете опцию перекомпиляция, SQL server попытается создать план выполнения" один размер подходит всем " для вашего запроса, и при каждом запуске будет выполняться полное сканирование индекса.
Это гораздо менее эффективно, чем поиск, и означает, что он потенциально сканирует целые индексы, которые ограничены диапазонами, которые вы даже не запрашиваете:@
- объявить переменную
- установите его своей командой и добавьте динамические части, такие как значения параметров использования sp(здесь @IsMonday и @IsTuesday-это параметры sp)
выполнить команду
declare @sql varchar (100) set @sql ='select * from #td1' if (@IsMonday+@IsTuesday !='') begin set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )' end exec( @sql)