Moet de scalaire variabele declareren

@RowFrom int

@RowTo int

zijn beide algemene invoerparameters voor de opgeslagen procedure, en aangezien ik de SQL-query in de opgeslagen procedure compileer met T-SQL, gebruik ik vervolgens Exec(@sqlstatement)aan het einde van de opgeslagen procedure om het resultaat te tonen, krijg ik deze foutmelding wanneer ik de @RowFromof @RowToprobeer te gebruiken in de @sqlstatementvariabele die wordt uitgevoerd .. het werkt verder prima.. help alstublieft.

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

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

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

maar @RowTogeeft de waarde nog steeds niet door aan @Rten genereert een fout.


Antwoord 1, autoriteit 100%

Je kunt een int niet samenvoegen met een string. In plaats van:

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

Je hebt nodig:

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

Om te helpen illustreren wat 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 sys.sp_executesql @sql;

Om dat in een string te bouwen (zelfs als het uiteindelijk een getal zal zijn), moet ik het converteren. Maar zoals u kunt zien, wordt het nummer nog steeds als een nummer behandeld wanneer het wordt uitgevoerd. Het antwoord is 25, toch?

In jouw geval hoef je @Rt etc. niet 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 parametrering te hebben, bijv.

SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
EXEC sys.sp_executesql @sql,
  N'@RowFrom int, @RowTo int',
  @RowFrom, @RowTo;

Antwoord 2, autoriteit 18%

Je kunt deze foutmelding ook krijgen als een variabele wordt gedeclareerd vóór een GOen daarna wordt verwezen.

Bekijk deze vraagen deze oplossing.


Antwoord 3, autoriteit 8%

Ter info, ik weet dat dit een oud bericht is, maar afhankelijk van de COLLATION-instellingen van de database kun je deze foutmelding krijgen bij een statement als dit,

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

als je bijvoorbeeld de S typt in de

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

sorry dat ik de antwoorden die hier al zijn gepost, verdraait, maar dit is een echt exemplaar van de gerapporteerde fout.

Houd er rekening mee dat de fout de hoofdletter S niet in het bericht zal weergeven, ik weet niet zeker waarom, maar ik denk dat het komt omdat de

Set @sql =

bevindt zich links van het gelijkteken.


Antwoord 4, autoriteit 4%

Gewoon toevoegen wat het voor mij heeft opgelost, waarbij spelfout de verdachte is volgens deze MSDN-blog

Bij het splitsen van SQL-tekenreeksen over meerdere regels, moet u controleren of u een komma scheidt tussen uw SQL-tekenreeks en uw parameters (en niet probeert ze samen te voegen!) en dat u geen spaties mist aan het einde van elke gesplitste regel. Geen rocket science, maar ik hoop dat ik iemand hoofdpijn kan besparen.

Bijvoorbeeld:

db.TableName.SqlQuery(
    "SELECT Id, Timestamp, User " +
    "FROM dbo.TableName " +
    "WHERE Timestamp >= @from " +
    "AND Timestamp <= @till;" + [USE COMMA NOT CONCATENATE!]
    new SqlParameter("from", from),
    new SqlParameter("till", till)),
    .ToListAsync()
    .Result;

Antwoord 5, autoriteit 3%

Soms, als je een ‘GO’-statement hebt geschreven na het gebruik van de variabele, en als je het daarna probeert te gebruiken, geeft het een dergelijke fout. Probeer de ‘GO’-verklaring te verwijderen als je die hebt.


Antwoord 6

Hoofdlettergevoeligheid zal dit probleem ook veroorzaken.

@MyVariable en @myvariable zijn dezelfde variabelen in SQL Server Man. Studio en zal werken. Deze variabelen zullen echter resulteren in een “Moet de scalaire variabele “@MyVariable” declareren in Visual Studio (C#) vanwege verschillen in hoofdlettergevoeligheid.


Antwoord 7

Gewoon een antwoord voor toekomstige ik (misschien helpt het ook iemand anders!). Als u iets als dit probeert uit te voeren in de query-editor:

USE [Dbo]
GO
DECLARE @RC int
EXECUTE @RC = [dbo].[SomeStoredProcedure] 
   2018
  ,0
  ,'arg3'
GO
SELECT month, SUM(weight) AS weight, SUM(amount) AS amount 
FROM SomeTable AS e 
WHERE year = @year AND type = 'M'

En je krijgt de foutmelding:

Moet de scalaire variabele “@year” declareren

Dat komt omdat je een heleboel code probeert uit te voeren die BEIDEde uitvoering van de opgeslagen procedure bevat ENde query eronder (!). Markeer gewoon degene die je wilt uitvoeren of verwijder / becommentarieer degene waarin je niet geïnteresseerd bent.


Antwoord 8

Als iemand anders deze vraag tegenkomt terwijl er geen oplossing hier is waardoor mijn sql-bestand werkt, dan is dit wat mijn fout was:

Ik heb de inhoud van mijn database geëxporteerd via de opdracht ‘Script genereren’ van Microsofts’ Server Management Studio en daarna enkele bewerkingen uitgevoerd terwijl ik de gegenereerde gegevens in een andere instantie invoeg.

Vanwege de gegenereerde export zijn er een aantal “GO”-instructies in het sql-bestand.

Wat ik niet wist, was dat variabelen die bovenaan een bestand worden gedeclareerd, niet toegankelijk zijn voor zover een GO-statement wordt uitgevoerd. Daarom moest ik de GO-instructies verwijderenin mijn sql-bestand en de fout “Moet de scalaire variabele xy declareren” was verdwenen!


Antwoord 9

Dit is hoogstwaarschijnlijk geen antwoord op het probleem zelf, maar deze vraag verschijnt als eerste resultaat bij het zoeken naar Sql declare scalar variabledaarom deel ik een mogelijke oplossing voor deze fout.

In mijn geval werd deze fout veroorzaakt door het gebruik van ;na een SQL-instructie. Verwijder het gewoon en de fout is verdwenen.

Ik denk dat de oorzaak dezelfde is als @IronSean die al in een opmerking hierboven heeft gepost:

het is vermeldenswaard dat het gebruik van GO (of in dit geval 😉 een nieuwe branch veroorzaakt waar gedeclareerde variabelen niet zichtbaar zijn voorbij het statement.

Bijvoorbeeld:

DECLARE @id int
SET @id = 78
SELECT * FROM MyTable WHERE Id = @var; <-- remove this character to avoid the error message
SELECT * FROM AnotherTable WHERE MyTableId = @var

Other episodes