必须声明标量variables

@RowFrom int

@RowTo int

都是存储过程的全局input参数,并且由于我正在使用T-SQL编译存储过程中的SQL查询,然后在存储过程结束时使用Exec(@sqlstatement)来显示结果,所以它给了我这个错误当我尝试使用@RowFrom@RowTo里面的@sqlstatementvariables被执行..否则工作正常..请帮助。

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

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

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

@RowTo仍然不会将其值传递给@Rt并生成一个错误。

你不能连接一个int到一个string。 代替:

 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; 

为了把它构build成一个string(即使最终它将是一个数字),我需要将其转换。 但是正如你所看到的那样,这个号码在执行时仍然被视为一个号码。 答案是25,对吗?

在你的情况下,你不需要在@sqlstring中重新声明@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; 

只是供参考,我知道这是一个旧的职位,但取决于数据库的COLLATION设置,你可以得到这样的错误,

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

例如,如果你错字S中的

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

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

还要注意这个错误在邮件中不会显示大写字母S,我不知道为什么,但是我想是因为这个

 Set @sql = 

在等号的左边。

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

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

只是增加了什么修复了我,在这个MSDN博客拼写错误是嫌疑犯…

将多个SQLstring分成多行时,请检查您是否将逗号分开(而不是试图连接它们!),并且在每个分割行末尾不会有空格。 不是火箭科学,但希望我救人头痛。

例如:

 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;