Использование динамического SQL с EXEC и sp-execute-sql

Завершено

Dynamic SQL позволяет создать символьную строку, которая может выполняться как T-SQL в качестве альтернативы хранимым процедурам. Динамический SQL полезен, если вы не знаете определенные значения до времени выполнения.

Существует два способа создания динамического SQL либо с помощью:

  1. Ключевые слова EXECUTE или EXEC .
  2. Системная хранимая процедура sp_executesql.

Динамический SQL с помощью EXECUTE или EXEC

Для записи динамической инструкции SQL с помощью EXECUTE или EXEC используется следующий синтаксис:

EXEC (@string_variable);

В следующем примере мы объявляем переменную @sqlstring типа VARCHAR, а затем назначаем ей строку.

DECLARE @sqlstring AS VARCHAR(1000);
    SET @sqlstring='SELECT customerid, companyname, firstname, lastname 
    FROM SalesLT.Customer;'
EXEC(@sqlstring);
GO

Динамический SQL с помощью Sp_executesql

Sp_executesql позволяет выполнять инструкцию T-SQL с параметрами. Sp_executesql можно использовать вместо хранимых процедур, если вы хотите передать другое значение инструкции. Инструкция T-SQL остается той же, и изменяются только значения параметров. Как и хранимые процедуры, скорее всего, оптимизатор запросов SQL Server будет повторно использовать план выполнения.

Sp_executesql принимает инструкцию T-SQL в качестве аргумента, которая может быть константой Юникода или переменной Юникода. Например, оба этих примера кода допустимы:

DECLARE @sqlstring1 NVARCHAR(1000);
SET @SqlString1 =
    N'SELECT TOP(10) name, listprice
    FROM SalesLT.Product
    GROUP BY name, listprice
    ORDER BY listprice DESC;'
EXECUTE sp_executesql @SqlString1;

OR

EXECUTE sp_executesql N'SELECT TOP(10) name, listprice
    FROM SalesLT.Product
    GROUP BY name, listprice
    ORDER BY listprice DESC;'

В этом примере параметр передается в инструкцию T-SQL:

EXECUTE sp_executesql   
          N'SELECT * FROM SalesLT.Customer   
          WHERE CompanyName = @company',  
          N'@company nvarchar(128)',  
          @company = "Sharp Bikes";