如何修复 sql 服务器动态查询中的 "Must declare the scalar variable" 问题?

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

我正在尝试在 sql 服务器中执行此语句:

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

这里@lnRowIdMin声明为整型变量,@lvcBaseTable在我原来的代码中声明为varchar(255)变量

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

Must declare the scalar variable

然后我把语句改成了:

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

现在它抛出这个错误:"Incorrect syntax near '='"

当执行动态 SQL 时,它会在 不同的作用域 中执行,因此如果您在与 varchar 相同的作用域中声明变量,则可以使用 SQL语句,你会得到这样的错误。

正确的做法是:

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

但是你无法从动态外部访问这个变量 SQL,我想这就是你想要的。

两种解决方法:

  1. 将使用变量的代码也放在动态 SQL 中。
  2. 在一些临时 table 中插入值,然后您可以在动态 SQL 之外使用它,只需对临时 table.[=26= 执行 SELECT ]

总的来说,@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;