sql >> Base de Datos >  >> RDS >> Sqlserver

Debe declarar la variable escalar

No puede concatenar un int a una cadena. En lugar de:

SET @sql = N'DECLARE @Rt int; SET @Rt = ' + @RowTo;

Necesitas:

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

Para ayudar a ilustrar lo que está sucediendo aquí. 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 eso en una cadena (incluso si finalmente será un número), necesito convertirlo. Pero como puede ver, el número aún se trata como un número cuando se ejecuta. La respuesta es 25, ¿verdad?

En su caso, puede usar la parametrización adecuada en lugar de usar la concatenación que, si adquiere ese hábito, se expondrá a la inyección SQL en algún momento (vea esto y esto:

SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';

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