sql >> Databasteknik >  >> RDS >> Sqlserver

Måste deklarera den skalära variabeln

Du kan inte sammanfoga en int till en sträng. Istället för:

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

Du behöver:

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

För att illustrera vad som händer här. Låt oss säga @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;

För att bygga det till en sträng (även om det i slutändan blir ett nummer), måste jag konvertera det. Men som du kan se behandlas numret fortfarande som ett nummer när det exekveras. Svaret är 25, eller hur?

I ditt fall kan du använda korrekt parametrering snarare än att använda sammanlänkning som, om du kommer in i den vanan, kommer du att utsätta dig själv för SQL-injektion någon gång (se detta och det här:

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

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


  1. Hur man skapar en användare med pgAdmin

  2. Returnera det aktuella arbetsstationsnamnet som är anslutet till SQL Server (T-SQL)

  3. Trigger kontra kontrollbegränsning

  4. Få maxvärde från rader och gå med i en annan tabell