Muss die skalare Variable deklarieren

79

@RowFrom int

@RowTo int

sind beide globale Eingabeparameter für die gespeicherte Prozedur. Da ich die SQL-Abfrage innerhalb der gespeicherten Prozedur mit T-SQL kompiliere und sie Exec(@sqlstatement)am Ende der gespeicherten Prozedur verwende, um das Ergebnis anzuzeigen , wird mir dieser Fehler angezeigt, wenn ich versuche, sie zu verwenden die @RowFromoder @RowToinnerhalb der @sqlstatementVariablen, die ausgeführt wird .. es funktioniert gut, sonst .. bitte helfen.

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

Außerdem habe ich versucht, Folgendes in die @sqlstatementVariable aufzunehmen:

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

@RowToÜbergibt seinen Wert jedoch immer noch nicht an @Rt und generiert einen Fehler.

Rechnung
quelle
5
Ich werde keine Antwort hinzufügen, da dies nicht speziell für diese Frage gilt. Als erstes Ergebnis bei Google für diesen Fehler ist jedoch zu beachten, dass die Verwendung GOeinen neuen Zweig verursacht, in dem deklarierte Variablen nach der Anweisung nicht sichtbar sind.
IronSean

Antworten:

74

Sie können ein int nicht mit einer Zeichenfolge verknüpfen. Anstatt:

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

Du brauchst:

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

Um zu veranschaulichen, was hier passiert. Sagen wir @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;

Um das in einen String zu integrieren (auch wenn es letztendlich eine Zahl sein wird), muss ich ihn konvertieren. Wie Sie jedoch sehen können, wird die Nummer bei ihrer Ausführung immer noch als Nummer behandelt. Die Antwort ist 25, richtig?

In Ihrem Fall müssen Sie @Rt usw. in der @ sql-Zeichenfolge nicht wirklich neu deklarieren. Sie müssen nur sagen:

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

Eine ordnungsgemäße Parametrierung wäre jedoch besser, z

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

EXEC sys.sp_executesql @sql,
  N'@RowFrom int, @RowTo int',
  @RowFrom, @RowTo;
Aaron Bertrand
quelle
2
Danke, aber was macht der N '?
Rechnung
3
Es stellt sicher, dass Ihre @sqlVariable korrekt interpretiert wird als NVARCHAR- eine Anforderung, wenn sp_executesql...
Aaron Bertrand
1
Nun, sie müssen Int sein, weil es wie folgt verwendet wird "Where RowNum Between @RowFrom and @RowTo" Der Parameter @ RowFrom / @ RowTo ist int, ebenso wie der Declared ..
Rechnung
4
Ja, verstanden. Sie erstellen eine SQL-Zeichenfolge und befinden sich auf zwei Ebenen des Gültigkeitsbereichs. Auf der obersten Ebene erstellen Sie eine Zeichenfolge - die gesamte Verkettung muss mit Zeichenfolgenwerten erfolgen, unabhängig davon, ob es sich um '5' oder 'foo' oder 'zuluxxy' handelt. Ich werde ein Beispiel hinzufügen, um es zu veranschaulichen.
Aaron Bertrand
8

Sie können diese Fehlermeldung auch erhalten, wenn eine Variable vor a deklariert GOund danach referenziert wird.

Siehe diese Frage und diese Problemumgehung .

Pierre C.
quelle
6

Nur zu Ihrer Information, ich weiß, dass dies ein alter Beitrag ist, aber abhängig von den Einstellungen für die Datenbank-COLLATION können Sie diesen Fehler bei einer Anweisung wie dieser erhalten.

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

Wenn Sie zum Beispiel das S in das eingeben

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

Es tut uns leid, die hier bereits veröffentlichten Antworten auszulagern, aber dies ist eine tatsächliche Instanz des gemeldeten Fehlers.

Beachten Sie auch, dass der Fehler nicht das Großbuchstaben S in der Nachricht anzeigt. Ich bin mir nicht sicher, warum, aber ich denke, es liegt daran, dass die

Set @sql =

befindet sich links vom Gleichheitszeichen.

htm11h
quelle
3

Ich füge nur hinzu, was es für mich behoben hat, wo Rechtschreibfehler der Verdächtige gemäß diesem MSDN-Blog sind ...

Stellen Sie beim Aufteilen von SQL-Zeichenfolgen auf mehrere Zeilen sicher, dass Sie Ihre SQL-Zeichenfolge durch Komma von Ihren Parametern trennen (und nicht versuchen, sie zu verketten!) Und keine Leerzeichen am Ende jeder geteilten Zeile fehlen. Keine Raketenwissenschaft, aber ich hoffe, ich erspare jemandem Kopfschmerzen.

Zum Beispiel:

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;
Tim Tyler
quelle
0

Die Groß- und Kleinschreibung wird auch dieses Problem verursachen.

@MyVariable und @myvariable sind dieselben Variablen in SQL Server Man. Studio und wird funktionieren. Diese Variablen führen jedoch in Visual Studio (C #) aufgrund von Unterschieden zwischen Groß- und Kleinschreibung zu der Meldung "Muss die skalare Variable" @MyVariable deklarieren ".

Hans M Ohio
quelle
0

Nur eine Antwort für die Zukunft von mir (vielleicht hilft es auch jemand anderem!). Wenn Sie versuchen, so etwas im Abfrageeditor auszuführen:

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'

Und Sie erhalten den Fehler:

Muss die skalare Variable "@year" deklarieren

Das ist , weil Sie versuchen , eine Reihe von Code auszuführen, der folgendes beinhaltet BEIDE die gespeicherte Prozedur die Ausführung und die Abfrage darunter (!). Markieren Sie einfach diejenige, die Sie ausführen möchten, oder löschen / kommentieren Sie diejenige, die Sie nicht interessiert.

Saiyancoder
quelle
0

Wenn jemand anderes auf diese Frage stößt, während hier keine Lösung meine SQL-Datei zum Laufen gebracht hat, war hier mein Fehler:

Ich habe den Inhalt meiner Datenbank über den Befehl 'Generate Script' von Microsoft Server Management Studio exportiert und anschließend einige Vorgänge ausgeführt, während ich die generierten Daten in eine andere Instanz eingefügt habe.

Aufgrund des generierten Exports gab es eine Reihe von "GO" -Anweisungen in der SQL-Datei.

Was ich nicht wusste, war, dass Variablen, die oben in einer Datei deklariert sind, nicht zugänglich sind, solange eine GO-Anweisung ausgeführt wird. Daher musste ich die GO-Anweisungen in meiner SQL-Datei entfernen und der Fehler "Muss die skalare Variable xy deklarieren" war verschwunden!

pbur
quelle
0

Dies ist höchstwahrscheinlich keine Antwort auf das Problem selbst, aber diese Frage wird als erstes Ergebnis bei der Suche angezeigt Sql declare scalar variable daher teile ich eine mögliche Lösung für diesen Fehler.

In meinem Fall wurde dieser Fehler durch die Verwendung von ;nach einer SQL-Anweisung verursacht. Entfernen Sie es einfach und der Fehler wird verschwunden sein.

Ich denke, die Ursache ist die gleiche wie bei @IronSean, die bereits in einem Kommentar oben gepostet wurde:

Es ist erwähnenswert, dass die Verwendung von GO (oder in diesem Fall;) einen neuen Zweig verursacht, in dem deklarierte Variablen nach der Anweisung nicht sichtbar sind.

Zum Beispiel:

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
ViRuSTriNiTy
quelle