@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.
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;
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.
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.