Nie można połączyć int z łańcuchem. Zamiast:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + @RowTo;
Potrzebujesz:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
Aby pomóc zilustrować, co się tutaj dzieje. Powiedzmy, że @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;
Aby zbudować z tego łańcuch (nawet jeśli ostatecznie będzie to liczba), muszę go przekonwertować. Ale jak widać, liczba jest nadal traktowana jako liczba podczas wykonywania. Odpowiedź to 25, prawda?
W twoim przypadku możesz użyć odpowiedniej parametryzacji zamiast używać konkatenacji, która, jeśli wpadniesz w ten nawyk, w pewnym momencie narazisz się na wstrzyknięcie SQL (zobacz to i to:
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
EXEC sys.sp_executesql @sql,
N'@RowFrom int, @RowTo int',
@RowFrom, @RowTo;