Musí deklarovať skalárnu premennú

@RowFrom int

@RowTo int

sú obidva globálne vstupné parametre pre uloženú procedúru a keďže kompilujem SQL dotaz vo vnútri uloženej procedúry pomocou T-SQL a potom používam Exec(@sqlstatement) na konci uloženej procedúry na zobrazenie výsledku, tak mi to dáva túto chybu, keď sa pokúsim použiť @RowFrom alebo @RowTo vo vnútri premennej @sqlstatement, ktorá sa vykonáva.. inak to funguje dobre.. prosím o pomoc.

"Must declare the scalar variable "@RowFrom"."

Tiež som skúsil zahrnúť nasledujúce údaje do premennej @sqlstatement:

'Declare @Rt int'
'SET @Rt = ' + @RowTo

ale @RowTo stále neprenáša svoju hodnotu do @Rt a generuje chybu.

Riešenie

Nemôžete spojiť int s reťazcom. Namiesto:

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

Potrebujete:

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

Na ilustráciu toho, čo sa tu deje. Povedzme, že @RowTo = 5.

DECLARE @RowTo INT;
SET @RowTo = 5;

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT ' + CONVERT(VARCHAR(12), @RowTo) + ' * 5';
EXEC sp_executeSQL @sql;

Aby som z toho vytvoril reťazec (aj keď to nakoniec bude číslo), musím ho previesť. Ale ako vidíte, pri vykonávaní sa s číslom stále zaobchádza ako s číslom. Odpoveď je 25, však?

Vo vašom prípade naozaj nemusíte znova deklarovať @Rt atď. vnútri reťazca @sql, stačí povedať:

SET @sql = @sql + ' WHERE RowNum BETWEEN ' 
    + CONVERT(VARCHAR(12), @RowFrom) + ' AND ' 
    + CONVERT(VARCHAR(12), @RowTo);

Hoci by bolo lepšie mať správnu parametrizáciu, napr.

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

EXEC sp_executesql @sql,
  N'@RowFrom INT, @RowTo INT',
  @RowFrom, @RowTo;
Komentáre (4)

Len pre vašu informáciu, viem, že je to starý príspevok, ale v závislosti od nastavení databázy COLLATION môžete dostať túto chybu pri príkaze, ako je tento,

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

ak napríklad prepisujete S v

SET @sql = @***S***ql 

ospravedlňujeme sa za to, že sme tu už uverejnili odpovede, ale toto je skutočný prípad hlásenej chyby.

Všimnite si tiež, že chyba nezobrazí veľké S v správe, nie som si istý prečo, ale myslím si, že je to preto, že

Set @sql =

je naľavo od znamienka rovnosti.

Komentáre (1)

Tento problém spôsobuje aj citlivosť na veľké a malé písmená.

@MyVariable a @myvariable sú v SQL Server Man rovnaké premenné. Studio a budú fungovať. Avšak tieto premenné budú mať za následok "Must declare the scalar variable "@MyVariable" vo Visual Studiu (C#) kvôli rozdielom v citlivosti veľkých a malých písmen.

Komentáre (0)