首页 > 解决方案 > 带有字符串的动态 SQL,包括 SQL Server 中的变量声明

问题描述

是否可以运行包含变量声明的动态 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”附近的语法不正确。

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

标签: sql-serverdynamic-sql

解决方案


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

您的查询


推荐阅读