Динамический SQL со строкой, включая объявление переменных в SQL Server - PullRequest
0 голосов
/ 10 мая 2018

Можно ли запускать динамические сценарии SQL, которые включают объявление переменных?

Пример:

Важное примечание : этот пример только для демонстрации механизма, который мне нужно реализовать. Показанный расчет тривиален для простоты.

Мне нужно вернуть минимальное значение между 4 переданными значениями, поэтому программно я создаю строку, содержащую следующий код:

DECLARE @_1 INT = 12 ;
DECLARE @_2 INT = 22 ;
DECLARE @_3 INT = 32 ;
DECLARE @_4 INT = 42 ;
DECLARE @_Min   = NULL ;

SET @_Min = @_1 ;
IF (@_2 < @_Min) SET @_Min = @_2 ;
IF (@_3 < @_Min) SET @_Min = @_3 ;
IF (@_4 < @_Min) SET @_Min = @_4 ;

SELECT @_Min ;

Опять же, все это содержится в строковой переменной (скажем, @_Command).

Чтобы выполнить это и получить результат расчета, я бы запустил следующую команду:

EXECUTE sp_executesql @_l_Command                     , 
                      N'@_l_Result FLOAT OUTPUT'      , 
                      @_l_Result = @_l_Result OUTPUT    ;

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

Сообщение 156, Уровень 15, Состояние 1, Строка 1 Неверный синтаксис рядом с ключевым словом «DECLARE».

Очевидно, что я делаю что-то синтаксически неправильно, но не могу понять, что это может быть.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Помимо установки типа переменной для @ _Min, если вам нужно передать значения, вы также должны передать входы как отдельные входы при выполнении sp_executesql , как показано ниже

DECLARE @_l_Command nVarchar(max),@Params nVarchar(max)
SET @_l_Command='SET @_Min = @_1 ;
IF (@_2 < @_Min) SET @_Min = @_2 ;
IF (@_3 < @_Min) SET @_Min = @_3 ;
IF (@_4 < @_Min) SET @_Min = @_4 ;

SELECT @_Min ;'


SET @Params='@_1 INT,@_2 INT,@_3 INT,@_4 INT,@_Min INT'
EXECUTE sp_executesql @_l_Command,@Params,12,22,32,42,NULL 
0 голосов
/ 10 мая 2018

Да, вы можете объявить переменные в динамическом запросе.пожалуйста, укажите тип переменной @_Min в запросеЯ запускаю ваш запрос без ошибок

DECLARE @_l_Result NVARCHAR(MAX)
DECLARE @_l_Command NVARCHAR(MAX)='
DECLARE @_1 INT = 12 ;
DECLARE @_2 INT = 22 ;
DECLARE @_3 INT = 32 ;
DECLARE @_4 INT = 42 ;
DECLARE @_Min int  = NULL ;

SET @_Min = @_1 ;
IF (@_2 < @_Min) SET @_Min = @_2 ;
IF (@_3 < @_Min) SET @_Min = @_3 ;
IF (@_4 < @_Min) SET @_Min = @_4 ;

SELECT @_Min as res ;'

EXECUTE sp_executesql @_l_Command                     , 
                      N'@_l_Result FLOAT OUTPUT'      , 
                      @_l_Result = @_l_Result OUTPUT    ;

или

EXECUTE sp_executesql @_l_Command

Your Query

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...