@RowFrom int
@RowTo int
sind beide globale Eingabeparameter für die gespeicherte Prozedur. Da ich die SQL-Abfrage in der gespeicherten Prozedur mit T-SQL kompiliere und dann Exec(@sqlstatement)
am Ende der gespeicherten Prozedur zum Anzeigen des Ergebnisses verwende, gibt es diesen Fehler, wenn ich es versuche Verwenden Sie den @RowFrom
oder @RowTo
in der ausgeführten @sqlstatement
-Variablen .. es funktioniert gut, sonst .. bitte helfen.
"Must declare the scalar variable "@RowFrom"."
Ich habe auch versucht, Folgendes in die Variable @sqlstatement
aufzunehmen:
'Declare @Rt int'
'SET @Rt = ' + @RowTo
@RowTo
übergibt seinen Wert jedoch immer noch nicht an @Rt
und generiert einen Fehler.
Sie können ein int nicht mit einer Zeichenfolge verketten. 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 sp_executeSQL @sql;
Um dies in einen String zu integrieren (auch wenn es letztendlich eine Zahl sein wird), muss ich es konvertieren. Aber wie Sie sehen, wird die Nummer beim Ausführen immer noch als Zahl 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 Folgendes sagen:
SET @sql = @sql + ' WHERE RowNum BETWEEN '
+ CONVERT(VARCHAR(12), @RowFrom) + ' AND '
+ CONVERT(VARCHAR(12), @RowTo);
Obwohl es besser wäre, eine korrekte Parametrisierung zu haben, z.
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
EXEC sp_executesql @sql,
N'@RowFrom INT, @RowTo INT',
@RowFrom, @RowTo;
Nur zu Ihrer Information, ich weiß, dass dies ein alter Beitrag ist, aber abhängig von den COLLATION-Einstellungen der Datenbank können Sie diesen Fehler in einer solchen Anweisung erhalten.
SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
wenn Sie zum Beispiel das S in der
SET @sql = @***S***ql
es tut uns leid, die hier bereits veröffentlichten Antworten auszuspalten, aber dies ist eine tatsächliche Instanz des gemeldeten Fehlers.
Beachten Sie auch, dass der Fehler nicht das Großbuchstabe S in der Nachricht anzeigt. Ich bin nicht sicher, warum, aber ich denke es liegt daran
Set @sql =
steht links vom Gleichheitszeichen.
Einfach hinzufügen, was es für mich behoben hat, wo falsche Schreibweise der Verdächtige laut diesem MSDN-Blog ist ...
Wenn Sie SQL-Zeichenfolgen über mehrere Zeilen aufteilen, stellen Sie sicher, dass Sie durch Komma die SQL-Zeichenfolge von Ihren Parametern trennen (und nicht versuchen, sie zu verketten!) Und keine Leerzeichen am Ende jeder Trennungslinie fehlen. Nicht eine Raketenwissenschaft, aber ich hoffe, ich kann jemandem Kopfschmerzen ersparen.
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;
Sie können diese Fehlermeldung auch erhalten, wenn eine Variable vor einer GO
deklariert und danach referenziert wird.
Siehe diese Frage und diese Problemumgehung .
Auch die Empfindlichkeit der Fälle wird dieses Problem verursachen.
@MyVariable und @myvariable sind die gleichen Variablen in SQL Server Man. Studio und wird funktionieren. Diese Variablen führen jedoch zu einem "Muss die skalare Variable" @MyVariable "in Visual Studio (C #) deklarieren, da Unterschiede zwischen Groß- und Kleinschreibung auftreten.
Nur eine Antwort für zukünftige mich (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 du bekommst den Fehler:
Muss die skalare Variable "@year" deklarieren
Das liegt daran, dass Sie versuchen, eine Reihe von Code auszuführen, der BOTH die Ausführung der gespeicherten Prozedur AND die Abfrage darunter (!) Enthält. Markieren Sie einfach diejenige, die Sie ausführen möchten, oder löschen/kommentieren Sie diejenige aus, die Sie nicht interessiert.