动态 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
是否可以 运行 包含变量声明的动态 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