Чтобы добавить значение локальной переменной в набор результатов динамического запроса - PullRequest
0 голосов
/ 04 марта 2019

У меня динамический запрос, в котором я хочу добавить значение локальной переменной в каждую строку набора результатов.У меня есть упрощенная версия примера ниже.

Хотя этот запрос работает нормально:

DECLARE @purchaseDate AS DATE
SET @purchaseDate = '12/23/2020'

SELECT Name, @purchaseDate 
FROM Fruits

Не работает аналогичный динамический SQL:

DECLARE @query AS NVARCHAR(MAX),
        @purchaseDate AS DATE

SET @purchaseDate = '12/23/2020'

SET @query = 'SELECT Name, @purchaseDate FROM Fruits' 

EXEC sp_executesql @query

Я получаю сообщение об ошибке

Должен объявить скалярную переменную "@purchaseDate".

Поэтому я предположил, что мне может потребоваться объявить в своем запросе buyDate динамический запрос SQLне может получить доступ к переменной.Итак, я попробовал это:

DECLARE @query AS NVARCHAR(MAX)

SET @query = 'DECLARE @purchaseDate AS DATE' +
             'SET @purchaseDate = ' + '12/23/2020 ' +
             'SELECT Name, @purchaseDate FROM Fruits' 

EXEC  sp_executesql @query

Но я получаю то же сообщение об ошибке.

Как мне исправить это?

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Нельзя ссылаться на переменную, объявленную вне динамического оператора внутри динамического оператора.Вам необходимо добавить объявление в параметры и передать значение:

DECLARE @query  AS nvarchar(MAX),
        @purchaseDate AS date;
SET @purchaseDate = '20201223';
SET @query = 'SELECT Name,@purchaseDate FROM Fruits;'; 
EXEC sp_executesql @query, N'@purchaseDate date', @purchaseDate = @purchaseDate;
0 голосов
/ 04 марта 2019

Рекомендуемый способ поместить переменную в динамический запрос с подготовленным оператором:

if OBJECT_ID('Fruits') is not null drop table Fruits

create table Fruits(
    name varchar(100)
)

insert into Fruits
values('apple')

DECLARE @purchaseDate AS DATE
SET @purchaseDate = '12/23/2020'

DECLARE @P1 int;  
EXEC sp_prepare @P1 output,   
    N'@purchaseDate date',  
    N'SELECT Name, @purchaseDate FROM Fruits';  
EXEC sp_execute @P1, @purchaseDate;  
EXEC sp_unprepare @P1;  

Взгляните на Microsoft Doku .

Если выленивый или просто хотите простое решение adhoc (не рекомендуется):

if OBJECT_ID('Fruits') is not null drop table Fruits

create table Fruits(
    name varchar(100)
)

insert into Fruits
values('apple')

DECLARE @query  AS NVARCHAR(MAX),
@purchaseDate AS DATE
SET @purchaseDate = '12/23/2020'
set @query = 'SELECT Name, ' + convert(nvarchar(10),@purchaseDate, 12) + ' FROM Fruits' 
exec sp_executesql @query
...