`@RowFrom int'(行距)
`@RowTo int
都是存储过程的全局输入参数,由于我正在用T-SQL编译存储过程中的SQL查询,然后在存储过程的最后使用Exec(@sqlstatement)
来显示结果,当我试图在执行的@sqlstatement
变量中使用@RowFrom
或@RowTo
时,会出现这个错误。
"Must declare the scalar variable "@RowFrom"."
另外,我试着在"@sqlstatement "变量中包括以下内容。
'Declare @Rt int'
'SET @Rt = ' + @RowTo
但@RowTo
仍然没有将其值传递给@Rt
,并产生了一个错误。
你不能将一个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;