Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Deve declarar a variável escalar


Você não pode concatenar um int para uma string. Ao invés de:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + @RowTo;

Você precisa:
SET @sql = N'DECLARE @Rt int; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);

Para ajudar a ilustrar o que está acontecendo aqui. Digamos @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;

Para construir isso em uma string (mesmo que no final seja um número), preciso convertê-lo. Mas como você pode ver, o número ainda é tratado como um número quando é executado. A resposta é 25, certo?

No seu caso você pode usar a parametrização adequada ao invés de usar a concatenação que, se você adquirir esse hábito, irá se expor a injeção de SQL em algum momento (veja isso e isso:
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';

EXEC sys.sp_executesql @sql,
  N'@RowFrom int, @RowTo int',
  @RowFrom, @RowTo;