不能将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,对吗?
在你的情况,你并不真的需要重新申报@Rt等@sql串里面,你只需要说:
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;
我不会添加一个答案,因为它不具体适用于这个问题,但作为谷歌这个错误的第一个结果,值得注意的是,使用'GO'会导致一个新的分支声明变量不可见过去的声明。 – IronSean