繁体   English   中英

如何解决sql server动态查询中“必须声明标量变量”的问题?

[英]How to fix "Must declare the scalar variable" issue in sql server dynamic query?

我正在尝试在 sql server 中执行此语句:

EXECUTE ('SELECT @lnRowIdMin = MIN(TMP_ROW_ID) FROM  #' + @lvcBaseTable).

在我的原始代码中, @lvcBaseTable @lnRowIdMin被声明为一个整数变量, @lvcBaseTable被声明为一个 varchar(255) 变量。

执行原代码抛出上述语句的错误:

必须声明标量变量

然后我将语句更改为:

EXECUTE ('SELECT ' + @lnRowIdMin + ' = MIN(TMP_ROW_ID) FROM  #' + @lvcBaseTable).

现在它抛出这个错误:“'='附近的语法不正确”

在执行动态 SQL 时,它是在不同的范围内执行的,因此如果您使用 SQL 语句将变量声明在与varchar bariable 相同的范围内,则会出现此类错误。

正确的做法是:

EXECUTE ('DECLARE @lnRowIdMin INT; SELECT @lnRowIdMin = MIN(TMP_ROW_ID) FROM  #' + @lvcBaseTable)

但是,您无法从动态 SQL 外部访问此变量,我认为这正是您想要的。

解决这个问题的两种方法:

  1. 将使用该变量的代码也放入动态 SQL 中。
  2. 将值插入某个临时表中,然后您可以在动态 SQL 之外使用它,只需对临时表执行SELECT

@lnRowIdMin@lnRowIdMin是在动态 SQL 之外声明的,并且需要分配值。 因此,您需要参数化您的 SQL,并使用OUTPUT参数:

--Prior stuff here, including declaration of @lnRowIdMin

DECLARE @SQL nvarchar(MAX),
        @Param nvarchar(MAX);
SET @SQL = N'SELECT @lnRowIdMin = MIN(TMP_ROW_ID) FROM  ' + QUOTENAME(N'#' + @lvcBaseTable) + N';';
SET @Param = N'@lnRowIdMin int OUTPUT'; --Guessed datatype

EXEC sp_executesql @SQL, @Param, @lnRowIdMin = @lnRowIdMin OUTPUT;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM