Muss die skalare Variable deklarieren

@RowFrom int`

@RowTo int

sind beide Global Input Params für die Stored Procedure, und da ich die SQL-Abfrage innerhalb der Stored Procedure mit T-SQL kompiliere und dann Exec(@sqlstatement) am Ende der Stored Procedure verwende, um das Ergebnis anzuzeigen, bekomme ich diese Fehlermeldung, wenn ich versuche, @RowFrom oder @RowTo innerhalb der @sqlstatement-Variable zu verwenden, die ausgeführt wird... sonst funktioniert es gut... bitte helfen Sie.

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

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

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

aber @RowTo übergibt seinen Wert immer noch nicht an @Rt und erzeugt einen Fehler.

Lösung

Sie können einen int nicht mit einem String verketten. Stattdessen:

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

brauchen Sie:

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

Um zu verdeutlichen, 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 diese Zahl in eine Zeichenkette zu verwandeln (auch wenn sie letztendlich eine Zahl sein wird), muss ich sie umwandeln. Aber wie Sie sehen können, wird die Zahl immer noch als Zahl behandelt, wenn sie ausgeführt wird. Die Antwort ist 25, richtig?

In Ihrem Fall brauchen Sie @Rt usw. innerhalb der @sql-Zeichenkette nicht wirklich neu zu deklarieren, Sie brauchen nur zu sagen:

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

Allerdings wäre es besser, eine richtige Parametrisierung vorzunehmen, z.B.

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

EXEC sp_executesql @sql,
  N'@RowFrom INT, @RowTo INT',
  @RowFrom, @RowTo;
Kommentare (4)

Nur zu Ihrer Information, ich weiß, dies ist ein alter Beitrag, aber je nach Datenbank COLLATION Einstellungen können Sie diesen Fehler auf eine Anweisung wie diese erhalten,

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

wenn man zum Beispiel das S in der Anweisung

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

Entschuldigen Sie, dass ich die Antworten, die hier bereits gepostet wurden, noch einmal aufgreife, aber dies ist ein tatsächliches Beispiel für den gemeldeten Fehler.

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

Set @sql =

auf der linken Seite des Gleichheitszeichens steht.

Kommentare (1)

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

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

Kommentare (0)