必须声明标量变量

时间:2011-08-24 20:39:03

标签: sql sql-server stored-procedures

@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并生成错误。

9 个答案:

答案 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