Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Doit déclarer la variable scalaire

Vous ne pouvez pas concaténer un int à une chaîne. Au lieu de :

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

Vous avez besoin :

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

Pour aider à illustrer ce qui se passe ici. Disons @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;

Afin de construire cela dans une chaîne (même si finalement ce sera un nombre), je dois le convertir. Mais comme vous pouvez le voir, le nombre est toujours traité comme un nombre lorsqu'il est exécuté. La réponse est 25, n'est-ce pas ?

Dans votre cas, vous pouvez utiliser un paramétrage approprié plutôt que d'utiliser la concaténation qui, si vous prenez cette habitude, vous exposera à un moment donné à l'injection SQL (voir ceci et ceci :

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

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