动态 SQL,字符串包含 SQL 服务器中的变量声明

Dynamic SQL with string including variables declaration in SQL Server

是否可以 运行 包含变量声明的动态 SQL 脚本?

示例:

重要说明:这个例子只是为了演示我需要实现的机制。为了简单起见,显示的计算是微不足道的。

我需要 return 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    ;

当 运行 连接它时,我收到一条错误消息:

Msg 156, Level 15, State 1, Line 1 Incorrect syntax near the keyword 'DECLARE'.

显然我在做一些语法错误的事情,但无法弄清楚它可能是什么。

是的,您可以在动态查询中声明变量。
请在查询中设置@_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

除了为@_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