Динамический SQL - вызова exec(@SQL) в сравнении с старпомов СП функции executesql(@SQL с)


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

EXEC (@SQL)

и

EXEC SP_EXECUTESQL @SQL

?

5 81

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 попытается создать план выполнения" один размер подходит всем " для вашего запроса, и при каждом запуске будет выполняться полное сканирование индекса.

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

  1. объявить переменную
  2. установите его своей командой и добавьте динамические части, такие как значения параметров использования sp(здесь @IsMonday и @IsTuesday-это параметры sp)
  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)