您不能将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;
GO
会导致新分支,其中声明的变量在语句后不可见。