@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 @RowFrom
oder @RowTo
innerhalb der @sqlstatement
Variablen, die ausgeführt wird .. es funktioniert gut, sonst .. bitte helfen.
"Must declare the scalar variable "@RowFrom"."
Außerdem habe ich versucht, Folgendes in die @sqlstatement
Variable aufzunehmen:
'Declare @Rt int'
'SET @Rt = ' + @RowTo
@RowTo
Übergibt seinen Wert jedoch immer noch nicht an @Rt
und generiert einen Fehler.
sql
sql-server
stored-procedures
Rechnung
quelle
quelle
GO
einen neuen Zweig verursacht, in dem deklarierte Variablen nach der Anweisung nicht sichtbar sind.Antworten:
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;
quelle
@sql
Variable korrekt interpretiert wird alsNVARCHAR
- eine Anforderung, wennsp_executesql
...Sie können diese Fehlermeldung auch erhalten, wenn eine Variable vor a deklariert
GO
und danach referenziert wird.Siehe diese Frage und diese Problemumgehung .
quelle
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.
quelle
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;
quelle
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 ".
quelle
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:
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.
quelle
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!
quelle
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:
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
quelle