@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
并生成错误。 最佳答案
您不能将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 sys.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 sys.sp_executesql @sql,
N'@RowFrom int, @RowTo int',
@RowFrom, @RowTo;