Динамический SQL - EXEC (@SQL) и EXEC SP_EXECUTESQL (@SQL) - PullRequest
89 голосов
/ 14 февраля 2009

Каковы реальные плюсы и минусы выполнения команды динамического SQL в хранимой процедуре в SQL Server с использованием

EXEC (@SQL)

против

EXEC SP_EXECUTESQL @SQL

Ответы [ 5 ]

91 голосов
/ 14 февраля 2009

sp_executesql с большей вероятностью будет способствовать повторному использованию плана запроса. При использовании sp_executesql параметры явно указываются в вызывающей подписи. Эта превосходная статья описывает этот процесс .

Часто цитируемый справочник по многим аспектам динамического sql: Эрланд Соммарског должен прочитать: « Проклятие и благословения динамического SQL ».

20 голосов
/ 14 февраля 2009

Отличительной особенностью SP_EXECUTESQL является то, что он позволяет создавать параметризованные запросы, что очень хорошо, если вы заботитесь о внедрении SQL.

5 голосов
/ 17 июня 2013

Microsoft В статье sp_executesql рекомендуется использовать sp_executesql вместо execute.

Поскольку эта хранимая процедура поддерживает подстановку параметров , sp_executesql более универсален, чем EXECUTE; и потому что sp_executesql генерирует планы выполнения, которые с большей вероятностью будут sp_executesql, повторно используемый SQL Server, эффективнее , чем EXECUTE.

Итак, отнимите: Не используйте execute выражение . Используйте sp_executesql.

2 голосов
/ 06 января 2014

Я бы всегда использовал sp_executesql в наши дни, все что на самом деле это обертка для EXEC, которая обрабатывает параметры и переменные.

Однако не забывайте об OPTION RECOMPILE при настройке запросов к очень большим базам данных, особенно если ваши данные охватывают более одной базы данных и используете CONSTRAINT для ограничения сканирования индекса.

Если вы не используете OPTION RECOMPILE, сервер SQL будет пытаться создать план выполнения «один размер для всех» для вашего запроса и будет запускать полное сканирование индекса при каждом его запуске.

Это гораздо менее эффективно, чем поиск, и означает, что он потенциально сканирует целые индексы, ограниченные диапазонами, которые вы даже не запрашиваете: @

0 голосов
/ 19 ноября 2012
  1. Объявить переменную
  2. Установите его своей командой и добавьте динамические части, например, используйте значения параметров sp (здесь @IsMonday и @IsTuesday - sp params)
  3. выполнить команду

    declare  @sql varchar (100)
    set @sql ='select * from #td1'
    
    if (@IsMonday+@IsTuesday !='')
    begin
    set @sql= @sql+' where PickupDay in ('''+@IsMonday+''','''+@IsTuesday+''' )'
    end
    exec( @sql)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...