Moet de scalaire variabele declareren

@RowFrom int

@RowTo int

zijn beide Global Input Params voor de Stored Procedure, en omdat ik de SQL query in de Stored Procedure compileer met T-SQL en dan Exec(@sqlstatement) gebruik aan het einde van de stored procedure om het resultaat te tonen, geeft het me deze fout als ik probeer om de @RowFrom of @RowTo te gebruiken in de @sqlstatement variabele die wordt uitgevoerd... anders werkt het prima... help alstublieft.

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

Ik heb ook geprobeerd het volgende op te nemen in de @sqlstatement variabele:

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

maar @RowTo geeft nog steeds zijn waarde niet door aan @Rt en genereert een fout.

Oplossing

Je kunt een int niet aan een string koppelen. In plaats van:

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

Heb je nodig:

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

Om te helpen illustreren wat's hier gebeurt. Laten we zeggen @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;

Om dat in een string om te zetten (ook al wordt het uiteindelijk een getal), moet ik het omzetten. Maar zoals je kunt zien, wordt het getal nog steeds als een getal behandeld wanneer het'wordt uitgevoerd. Het antwoord is 25, toch?

In jouw geval hoef je @Rt etc. niet echt opnieuw te declareren binnen de @sql string, je hoeft alleen maar te zeggen:

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

Hoewel het beter zou zijn om de juiste parameterisatie te hebben, bijv.

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

EXEC sp_executesql @sql,
  N'@RowFrom INT, @RowTo INT',
  @RowFrom, @RowTo;
Commentaren (4)

Even ter info, ik weet dat dit een oude post is, maar afhankelijk van de database COLLATION instellingen kun je deze foutmelding krijgen op een statement als dit,

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

als je bijvoorbeeld de S intikt in de

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

sorry voor het afleiden van de antwoorden die hier al gepost zijn, maar dit is een echt geval van de gemelde fout.

Merk ook op dat de fout niet de hoofdletter S weergeeft in het bericht, ik weet niet zeker waarom, maar ik denk dat het komt omdat de

Set @sql =

links van het gelijkheidsteken staat.

Commentaren (1)

Hoofdlettergevoeligheid veroorzaakt dit probleem ook.

@MyVariable en @myvariable zijn dezelfde variabelen in SQL Server Man. Studio en zullen werken. Echter, deze variabelen zullen resulteren in een "Must declare the scalar variable "@MyVariable" in Visual Studio (C#) als gevolg van hoofdlettergevoeligheid verschillen.

Commentaren (0)