如何修复 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,我想这就是你想要的。
两种解决方法:
- 将使用变量的代码也放在动态 SQL 中。
- 在一些临时 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;
我正在尝试在 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,我想这就是你想要的。
两种解决方法:
- 将使用变量的代码也放在动态 SQL 中。
- 在一些临时 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;