必须声明标量变量

bil*_*ill 70 sql sql-server stored-procedures

@RowFrom int

@RowTo int

是存储过程的全局输入参数,因为我使用T-SQL编译存储过程内的SQL查询,然后Exec(@sqlstatement)在存储过程的末尾使用它来显示结果,当我尝试使用它时,它会给我这个错误在执行的变量中@RowFrom或者@RowTo内部@sqlstatement..否则工作正常..请帮助.

"Must declare the scalar variable "@RowFrom"."
Run Code Online (Sandbox Code Playgroud)

另外,我尝试在@sqlstatement变量中包含以下内容:

'Declare @Rt int'
'SET @Rt = ' + @RowTo
Run Code Online (Sandbox Code Playgroud)

@RowTo仍然没有将其值传递给@Rt 并生成错误.

Aar*_*and 62

您不能将int连接到字符串.代替:

SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + @RowTo;
Run Code Online (Sandbox Code Playgroud)

你需要:

SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
Run Code Online (Sandbox Code Playgroud)

为了帮助说明这里发生的事情.我们说@RowTo = 5.

DECLARE @RowTo INT;
SET @RowTo = 5;

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT ' + CONVERT(VARCHAR(12), @RowTo) + ' * 5';
EXEC sp_executeSQL @sql;
Run Code Online (Sandbox Code Playgroud)

为了将其构建成一个字符串(即使最终它将是一个数字),我需要转换它.但正如您所看到的,该数字在执行时仍被视为数字.答案是25,对吗?

在你的情况下,你真的不需要在@sql字符串中重新声明@Rt等,你只需要说:

SET @sql = @sql + ' WHERE RowNum BETWEEN ' 
    + CONVERT(VARCHAR(12), @RowFrom) + ' AND ' 
    + CONVERT(VARCHAR(12), @RowTo);
Run Code Online (Sandbox Code Playgroud)

虽然最好有适当的参数化,例如

SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';

EXEC sp_executesql @sql,
  N'@RowFrom INT, @RowTo INT',
  @RowFrom, @RowTo;
Run Code Online (Sandbox Code Playgroud)

  • 是的,明白了.您正在构建一个SQL字符串,并且您处于两个范围的范围.在顶层,您正在构建一个字符串 - 所有连接都需要使用字符串值,无论它们是'5'还是'foo'或'zuluxxy'.我将添加一个例子来说明. (4认同)
  • 它确保你的`@sql`变量被正确解释为`NVARCHAR` - 如果使用`sp_executesql`则需要... (3认同)
  • 谢谢,但N'做什么? (2认同)

Pie*_*e C 15

如果变量在 a 之前声明并在 aGO之后引用,您也会收到此错误消息。

请参阅此问题和此解决方法


ViR*_*iTy 7

这很可能不是问题本身的答案,但在搜索时这个问题会作为第一个结果弹出,Sql declare scalar variable因此我想分享一个可能的解决方案来解决这个错误。

;就我而言,这个错误是由于在 SQL 语句后使用造成的。只要删除它,错误就会消失。

我猜原因与 @IronSean 已经在上面的评论中发布的相同:

值得注意的是,使用 GO (或在本例中为 ;)会导致一个新分支,其中声明的变量在语句之后不可见。

例如:

DECLARE @id int
SET @id = 78

SELECT * FROM MyTable WHERE Id = @var; <-- remove this character to avoid the error message
SELECT * FROM AnotherTable WHERE MyTableId = @var
Run Code Online (Sandbox Code Playgroud)


htm*_*11h 5

仅供参考,我知道这是一篇过时的文章,但是根据数据库的COLLATION设置,您可能会在这样的语句中遇到此错误,

SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
Run Code Online (Sandbox Code Playgroud)

例如,如果您在

SET @sql = @***S***ql 
Run Code Online (Sandbox Code Playgroud)

很抱歉,无法提供此处已发布的答案,但这是所报告错误的实际实例。

另请注意,错误消息中不会显示大写字母S,我不确定为什么,但是我认为这是因为

Set @sql =
Run Code Online (Sandbox Code Playgroud)

在等号的左侧。