Использование динамического SQL с EXEC и sp-execute-sql
Dynamic SQL позволяет создать символьную строку, которая может выполняться как T-SQL в качестве альтернативы хранимым процедурам. Динамический SQL полезен, если вы не знаете определенные значения до времени выполнения.
Существует два способа создания динамического SQL либо с помощью:
- Ключевые слова EXECUTE или EXEC .
- Системная хранимая процедура 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";