Bạn không thể nối một int với một chuỗi. Thay vì:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + @RowTo;
Bạn cần:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
Để giúp minh họa những gì đang xảy ra ở đây. Giả sử @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;
Để xây dựng chuỗi đó thành một chuỗi (ngay cả khi cuối cùng nó sẽ là một số), tôi cần phải chuyển đổi nó. Nhưng như bạn có thể thấy, số vẫn được coi là một số khi nó được thực thi. Câu trả lời là 25, phải không?
Trong trường hợp của bạn, bạn có thể sử dụng tham số hóa thích hợp thay vì sử dụng nối, nếu bạn có thói quen đó, bạn sẽ để lộ bản thân với SQL injection vào một lúc nào đó (xem phần này và phần này:
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
EXEC sys.sp_executesql @sql,
N'@RowFrom int, @RowTo int',
@RowFrom, @RowTo;