sql-必须声明标量变量

@RowTo

@RowTo

都是存储过程的全局输入参数,并且由于我正在用T-SQL编译存储过程内部的SQL查询,然后在存储过程的末尾使用@RowTo来显示结果,因此当我尝试执行以下操作时会出现此错误 请在@sqlstatement执行的变量中使用@Rt@RowTo。否则它可以正常工作。

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

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

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

但是@RowTo仍未将其值传递给@Rt并生成错误。

bill asked 2019-10-09T04:15:36Z
5个解决方案
55 votes

您不能将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;
Aaron Bertrand answered 2019-10-09T04:16:16Z
4 votes

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

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

例如,如果您在

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

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

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

Set @sql =

在等号的左侧。

htm11h answered 2019-10-09T04:17:07Z
3 votes

只需添加对我而言已解决的问题,根据此MSDN博客,拼写错误是可疑的...

将SQL字符串分割成多行时,请检查您是否用逗号将SQL字符串与参数分开(并且不要试图将它们串联起来!),并且在每条分割行的末尾都不要缺少任何空格。 不是火箭科学,而是希望我能使人头疼。

例如:

db.TableName.SqlQuery(
    "SELECT Id, Timestamp, User " +
    "FROM dbo.TableName " +
    "WHERE Timestamp >= @from " +
    "AND Timestamp <= @till;" + [USE COMMA NOT CONCATENATE!]
    new SqlParameter("from", from),
    new SqlParameter("till", till)),
    .ToListAsync()
    .Result;
Tim Tyler answered 2019-10-09T04:17:41Z
0 votes

区分大小写也会导致此问题。

@MyVariable和@myvariable是SQL Server Man中的相同变量。 工作室,将工作。 但是,由于区分大小写的差异,这些变量将在Visual Studio(C#)中导致“必须声明标量变量” @MyVariable”。

Hans M Ohio answered 2019-10-09T04:18:12Z
0 votes

如果在GO之前声明了变量,并在其后引用了变量,则也可能会收到此错误消息。

请参阅此问题和此替代方法。

Pierre C answered 2019-10-09T04:18:43Z
translate from https://stackoverflow.com:/questions/7181976/must-declare-the-scalar-variable