Du kan inte sammanfoga en int till en sträng. Istället för:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + @RowTo;
Du behöver:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
För att illustrera vad som händer här. Låt oss säga @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;
För att bygga det till en sträng (även om det i slutändan blir ett nummer), måste jag konvertera det. Men som du kan se behandlas numret fortfarande som ett nummer när det exekveras. Svaret är 25, eller hur?
I ditt fall kan du använda korrekt parametrering snarare än att använda sammanlänkning som, om du kommer in i den vanan, kommer du att utsätta dig själv för SQL-injektion någon gång (se detta och det här:
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
EXEC sys.sp_executesql @sql,
N'@RowFrom int, @RowTo int',
@RowFrom, @RowTo;