Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Muss die skalare Variable deklarieren

Sie können ein int nicht mit einem String verketten. Statt:

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

Sie benötigen:

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

Um zu veranschaulichen, was hier passiert. Sagen wir @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;

Um das in einen String einzubauen (auch wenn es am Ende eine Zahl wird), muss ich es umwandeln. Aber wie Sie sehen können, wird die Zahl bei der Ausführung immer noch als Zahl behandelt. Die Antwort ist 25, richtig?

In Ihrem Fall können Sie die richtige Parametrisierung verwenden, anstatt die Verkettung zu verwenden, wodurch Sie sich, wenn Sie sich daran gewöhnen, irgendwann einer SQL-Injektion aussetzen (siehe dies und das:

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

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