Динамический SQL - EXEC (@SQL) по сравнению с EXEC SP_EXECUTESQL (@SQL)

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

EXEC (@SQL)

против

EXEC SP_EXECUTESQL @SQL

?

Ответ 1

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

Часто цитируемой ссылкой для многих аспектов динамического sql является Erland Sommarskog, который должен читать: " Проклятие и благословения динамического SQL".

Ответ 2

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

Ответ 3

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

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

Итак, заберите: Не используйте оператор execute. Используйте sp_executesql.

Ответ 4

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

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

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

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

Ответ 5

  • Объявить переменную
  • Установите его по вашей команде и добавьте динамические части, например, используйте значения параметров sp (здесь @IsMonday и @IsTuesday являются sp params)
  • выполните команду

    declare  @sql varchar (100)
    set @sql ='select * from #td1'
    
    if (@[email protected] !='')
    begin
    set @sql= @sql+' where PickupDay in ('''[email protected]+''','''[email protected]+''' )'
    end
    exec( @sql)