web-dev-qa-db-de.com

Muss die skalare Variable deklarieren

@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.

58
bill

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;
54
Aaron Bertrand

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.

4
htm11h

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;
3
Tim Tyler

Sie können diese Fehlermeldung auch erhalten, wenn eine Variable vor einer GO deklariert und danach referenziert wird.

Siehe diese Frage und diese Problemumgehung .

1
Pierre C

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.

0
Hans M Ohio

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.

0
saiyancoder