@RowFrom int
@RowTo int
是存储过程的全局输入参数,因为我使用T-SQL编译存储过程中的SQL查询,然后在存储过程结束时使用Exec(@sqlstatement)
来显示结果,它给出了当我尝试在执行的@RowFrom
变量中使用@RowTo
或@sqlstatement
时出现此错误..否则它会正常工作..请帮助。
"Must declare the scalar variable "@RowFrom"."
另外,我尝试在@sqlstatement
变量中包含以下内容:
'Declare @Rt int'
'SET @Rt = ' + @RowTo
但@RowTo
仍未将其值传递给@Rt
并生成错误。
答案 0 :(得分:56)
您无法将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;
答案 1 :(得分:4)
仅供参考,我知道这是一个旧帖子,但根据数据库COLLATION设置,你可以在这样的语句中得到这个错误,
SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
例如,如果您在
中输入了错字号SET @sql = @***S***ql
很遗憾地将已经发布的答案分拆出去,但这是报告的错误的实际实例。
另请注意,错误不会在消息中显示大写字母S,我不知道为什么,但我认为是因为
Set @sql =
位于等号的左侧。
答案 2 :(得分:3)
添加为我修复的内容,根据this MSDN blog错误拼写是嫌疑人......
在多行上拆分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;
答案 3 :(得分:1)
如果在GO
之前声明了变量,并在其后引用了变量,您也会收到此错误消息。
请参阅此question和此workaround。
答案 4 :(得分:1)
有时,如果您在使用变量后编写了“GO”语句,并且在此之后尝试使用它,则会引发此类错误。如果有的话,请尝试删除“GO”语句。
答案 5 :(得分:0)
大小写敏感度也会导致此问题。
@MyVariable和@myvariable是SQL Server Man中的相同变量。工作室,将工作。但是,由于区分大小写的差异,这些变量将导致在Visual Studio(C#)中“必须声明标量变量”@MyVariable“。
答案 6 :(得分:0)
这只是对我未来的一个答案(也许对其他人也有帮助!)。如果您尝试在查询编辑器中运行类似这样的内容:
USE [Dbo]
GO
DECLARE @RC int
EXECUTE @RC = [dbo].[SomeStoredProcedure]
2018
,0
,'arg3'
GO
SELECT month, SUM(weight) AS weight, SUM(amount) AS amount FROM SomeTable AS e WHERE year = @year AND type = 'M'
然后您得到错误:
Must declare the scalar variable "@year"
那是因为您试图运行一堆包含两者存储过程执行 AND 及其下面的查询(!)的代码。只需突出显示您要运行的代码或删除/注释您不感兴趣的代码即可。
答案 7 :(得分:0)
如果其他人遇到此问题,而此处没有解决方案使我的sql文件正常工作,这就是我的错误所在:
我一直通过Microsoft's Server Management Studio的“生成脚本”命令导出数据库的内容,然后在将生成的数据插入另一个实例中时进行一些操作。
由于生成了导出,因此sql文件中有一堆“ GO”语句。
我不知道的是,就执行GO语句而言,无法访问文件顶部声明的变量。 因此,我不得不在我的sql文件中删除GO语句,错误“必须声明标量变量xy”消失了!
答案 8 :(得分:0)
这很可能不是问题本身的答案,但是当搜索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