2011-08-24 45 views
45

@RowFrom int必须声明标量变量

@RowTo int

都是全局输入PARAMS的存储过程,因为我在编译存储过程中的SQL查询和T-SQL然后在最后使用Exec(@sqlstatement)的存储过程来显示结果,它给了我这个错误,当我尝试使用@sqlstatement变量中的@RowFrom@RowTo执行..它工作正常,否则..请帮助。

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

此外,我试图包括在@sqlstatement变量以下:

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

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

+0

我不会添加一个答案,因为它不具体适用于这个问题,但作为谷歌这个错误的第一个结果,值得注意的是,使用'GO'会导致一个新的分支声明变量不可见过去的声明。 – IronSean

回答

49

不能将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,对吗?

在你的情况,你并不真的需要重新申报@Rt等@sql串里面,你只需要说:

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

谢谢,但N是做什么的? – bill

+3

它确保你的'@ sql'变量被正确解释为'NVARCHAR' - 如果使用'sp_executesql'则需要... –

+1

那么它们需要是Int,因为它的使用像这样 “Where RowNum Between @RowFrom和@ RowTo“ 参数@ RowFrom/@ RowTo是int,以及声明.. – bill

4

仅供参考,我知道这是一个古老的职位,但根据数据库排序规则设置,您可以在这样一个说法得到这个错误,

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

例如,如果你错字在S在

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

遗憾的是,我们已经发布了这里已发布的答案,但这是一个实际报告的错误实例。

还要注意的是,消息中的错误将不会显示大写的S,我不知道为什么,但我认为这是因为

Set @sql = 

是等号的左边。

+0

非常重要的评论(和我的情况下的实际问题....) – Dani

0

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

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

0

只需添加对我来说固定的东西,其中拼写错误是可疑的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;