必须声明标量variables
@RowFrom int
@RowTo int
都是存储过程的全局input参数,并且由于我正在使用T-SQL编译存储过程中的SQL查询,然后在存储过程结束时使用Exec(@sqlstatement)
来显示结果,所以它给了我这个错误当我尝试使用@RowFrom
或@RowTo
里面的@sqlstatement
variables被执行..否则工作正常..请帮助。
"Must declare the scalar variable "@RowFrom"."
另外,我尝试在@sqlstatement
variables中包含以下内容:
'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;