bil*_*ill 70 sql sql-server stored-procedures
@RowFrom int
@RowTo int
是存储过程的全局输入参数,因为我使用T-SQL编译存储过程内的SQL查询,然后Exec(@sqlstatement)在存储过程的末尾使用它来显示结果,当我尝试使用它时,它会给我这个错误在执行的变量中@RowFrom或者@RowTo内部@sqlstatement..否则工作正常..请帮助.
"Must declare the scalar variable "@RowFrom"."
Run Code Online (Sandbox Code Playgroud)
另外,我尝试在@sqlstatement变量中包含以下内容:
'Declare @Rt int'
'SET @Rt = ' + @RowTo
Run Code Online (Sandbox Code Playgroud)
但@RowTo仍然没有将其值传递给@Rt 并生成错误.
Aar*_*and 62
您不能将int连接到字符串.代替:
SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + @RowTo;
Run Code Online (Sandbox Code Playgroud)
你需要:
SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
Run Code Online (Sandbox Code Playgroud)
为了帮助说明这里发生的事情.我们说@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;
Run Code Online (Sandbox Code Playgroud)
为了将其构建成一个字符串(即使最终它将是一个数字),我需要转换它.但正如您所看到的,该数字在执行时仍被视为数字.答案是25,对吗?
在你的情况下,你真的不需要在@sql字符串中重新声明@Rt等,你只需要说:
SET @sql = @sql + ' WHERE RowNum BETWEEN '
+ CONVERT(VARCHAR(12), @RowFrom) + ' AND '
+ CONVERT(VARCHAR(12), @RowTo);
Run Code Online (Sandbox Code Playgroud)
虽然最好有适当的参数化,例如
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
EXEC sp_executesql @sql,
N'@RowFrom INT, @RowTo INT',
@RowFrom, @RowTo;
Run Code Online (Sandbox Code Playgroud)
这很可能不是问题本身的答案,但在搜索时这个问题会作为第一个结果弹出,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
Run Code Online (Sandbox Code Playgroud)
仅供参考,我知道这是一篇过时的文章,但是根据数据库的COLLATION设置,您可能会在这样的语句中遇到此错误,
SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
Run Code Online (Sandbox Code Playgroud)
例如,如果您在
SET @sql = @***S***ql
Run Code Online (Sandbox Code Playgroud)
很抱歉,无法提供此处已发布的答案,但这是所报告错误的实际实例。
另请注意,错误消息中不会显示大写字母S,我不确定为什么,但是我认为这是因为
Set @sql =
Run Code Online (Sandbox Code Playgroud)
在等号的左侧。