Выполнить динамический запрос и присвоить значения двум переменным - PullRequest
0 голосов
/ 10 сентября 2018

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

DECLARE @MinDate VARCHAR(10) = ''
DECLARE @MaxDate VARCHAR(10) = ''

SET @SQL = 'SELECT @MinDate = Convert(Varchar,Cast(Min(ColumnDate) AS DATE),105),
                   @MaxDate = Convert(Varchar,Cast(Max(ColumnDate) AS DATE),105)
            FROM ['+@Table+']';

PRINT(@SQL);
EXEC(@SQL)

PRINT(@MinDate);
PRINT(@MaxDate);

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

Сообщение 137, Уровень 15, Состояние 1, Строка 5 Необходимо объявить скалярную переменную "@MaxDate".

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Как правильно сказал @Jeroen Mostert в комментариях, вам нужно использовать sp_executesql вместо EXEC.

sp_executesql позволяет предоставлять параметры для динамического SQL иэти параметры можно пометить как OUTPUT, что вам нужно здесь.

Кроме того, полезно использовать правильные параметры, чтобы предотвратить проблемы с внедрением SQL.В вашем примере @MinDate и @MaxDate могут и должны быть заданы как правильные параметры.@Table не может стать параметром, поэтому он останется связанным со строкой SQL.Только эта часть останется открытой для SQL-инъекций.

Вот пример:

DECLARE @MinDate_ VARCHAR(10) = '';
DECLARE @MaxDate_ VARCHAR(10) = '';
DECLARE @SQL nvarchar(max);

SET @SQL = 
    'SELECT 
        @MinDate = Convert(Varchar,Cast(Min(ColumnDate) AS DATE),105),
        @MaxDate = Convert(Varchar,Cast(Max(ColumnDate) AS DATE),105)
    FROM ['+@Table+']';

EXEC sp_executesql @SQL
    ,N'@MinDate VARCHAR(10) OUTPUT, @MaxDate VARCHAR(10) OUTPUT'
    ,@MinDate = @MinDate_ OUTPUT
    ,@MaxDate = @MaxDate_ OUTPUT
;

SELECT @MinDate_, @MaxDate_;

Обратите внимание, что вам нужно указать OUTPUT дважды.

Вы можетеиспользуйте одно и то же имя @MinDate для параметра, который вы объявляете вне динамического SQL и внутри динамического SQL, но я предпочитаю давать им разные имена (@MinDate и @MinDate_), поэтому меня не смущает, что к чему.

0 голосов
/ 10 сентября 2018

Вы можете попытаться разместить переменные в вашей строке:

SET @SQL = '
DECLARE @MinDate VARCHAR(10) = ''''
DECLARE @MaxDate VARCHAR(10) = ''''

SELECT @MinDate = Convert(Varchar,Cast(Min(ColumnDate) AS DATE),105),
       @MaxDate = Convert(Varchar,Cast(Max(ColumnDate) AS DATE),105)
FROM ['+@Table+']

PRINT(@MinDate)
PRINT(@MaxDate)
            '
EXEC(@SQL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...