必须声明标量变量

`@RowFrom int'(行距)

`@RowTo int

都是存储过程的全局输入参数,由于我正在用T-SQL编译存储过程中的SQL查询,然后在存储过程的最后使用Exec(@sqlstatement)来显示结果,当我试图在执行的@sqlstatement变量中使用@RowFrom@RowTo时,会出现这个错误。

"Must declare the scalar variable "@RowFrom"."

另外,我试着在"@sqlstatement "变量中包括以下内容。

'Declare @Rt int'
'SET @Rt = ' + @RowTo

@RowTo仍然没有将其值传递给@Rt,并产生了一个错误。

解决办法

你不能将一个int连接到一个字符串。而不是。

SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + @RowTo;

你需要。

SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);

为了帮助说明这里发生了什么。假设@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;

为了将其构建为一个字符串(即使最终它将是一个数字),我需要将其转换。但正如你所看到的,当它被执行时,这个数字仍然被当作一个数字处理。答案是25,对吗?

在你的案例中,你其实不需要在@sql字符串里面重新声明@Rt等,你只需要说。

SET @sql = @sql + ' WHERE RowNum BETWEEN ' 
    + CONVERT(VARCHAR(12), @RowFrom) + ' AND ' 
    + CONVERT(VARCHAR(12), @RowTo);

尽管最好能有适当的参数化,比如说。

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

EXEC sp_executesql @sql,
  N'@RowFrom INT, @RowTo INT',
  @RowFrom, @RowTo;
评论(4)

仅供参考,我知道这是个老帖子,但根据数据库的COLLATION设置,你可以在这样的语句中得到这个错误。

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

例如,如果你打错了S在

SET @sql = @***S***ql 

对不起,我已经把答案贴在这里了,但这是一个实际的错误报告实例。

还请注意,该错误不会在信息中显示大写的S,我不确定原因,但我认为这是因为

Set @sql =

是在等号的左边。

评论(1)

大小写敏感度也会导致这个问题。

@MyVariable和@myvariable在SQL Server Man.Studio中是相同的变量,可以工作。然而,由于大小写敏感度的不同,这些变量在Visual Studio(C#)中会导致出现"必须声明标量变量"@MyVariable"。

评论(0)