@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;

10-08 07:17