sql >> Databáze >  >> RDS >> Sqlserver

Musí deklarovat skalární proměnnou

Nemůžete zřetězit int do řetězce. Místo:

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

Potřebujete:

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

Abychom pomohli ilustrovat, co se zde děje. Řekněme @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;

Abych to zabudoval do řetězce (i když to nakonec bude číslo), musím to převést. Ale jak vidíte, číslo je po provedení stále považováno za číslo. Odpověď je 25, že?

Ve vašem případě můžete použít správnou parametrizaci spíše než použít zřetězení, které, pokud si osvojíte tento zvyk, vystavíte se v určité chvíli SQL injection (viz toto a toto:

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

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


  1. MySQL rychle vybere 10 náhodných řádků ze 600 000 řádků

  2. Příprava serveru MySQL nebo MariaDB pro produkci – část druhá

  3. Základy tabulkových výrazů, 1. část

  4. Skupiny dostupnosti SQL Server AlwaysOn:Instalace a konfigurace. Část 2