@RowFrom int
@RowTo int
sono entrambi parametri di input globali per la Stored Procedure, e dal momento che sto compilando la query SQL all'interno della Stored Procedure con T-SQL poi usando Exec(@sqlstatement)
alla fine della stored procedure per mostrare il risultato, mi dà questo errore quando cerco di usare il @RowFrom
o @RowTo
all'interno della variabile @sqlstatement
che viene eseguita.. funziona bene altrimenti.. per favore aiutatemi.
"Must declare the scalar variable "@RowFrom"."
Inoltre, ho provato a includere quanto segue nella variabile @sqlstatement
:
'Declare @Rt int'
'SET @Rt = ' + @RowTo
ma @RowTo
continua a non passare il suo valore a @Rt
e genera un errore.
Non si può concatenare un int a una stringa. Invece di:
SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + @RowTo;
Hai bisogno di:
SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
Per aiutare ad illustrare ciò che sta accadendo qui. Diciamo che @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;
Per poterlo costruire in una stringa (anche se alla fine sarà un numero), ho bisogno di convertirlo. Ma come potete vedere, il numero è ancora trattato come un numero quando viene eseguito. La risposta è 25, giusto?
Nel tuo caso non hai davvero bisogno di ridichiarare @Rt ecc. all'interno della stringa @sql, hai solo bisogno di dire:
SET @sql = @sql + ' WHERE RowNum BETWEEN '
+ CONVERT(VARCHAR(12), @RowFrom) + ' AND '
+ CONVERT(VARCHAR(12), @RowTo);
Anche se sarebbe meglio avere una parametrizzazione adeguata, ad es.
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
EXEC sp_executesql @sql,
N'@RowFrom INT, @RowTo INT',
@RowFrom, @RowTo;
Solo per tua informazione, so che questo è un vecchio post, ma a seconda delle impostazioni di COLLATION del database puoi ottenere questo errore su una dichiarazione come questa,
SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
se per esempio scrivete la S in
SET @sql = @***S***ql
scusate se mi scuso per le risposte già postate qui, ma questa è un'istanza reale dell'errore riportato.
Notate anche che l'errore non mostrerà la S maiuscola nel messaggio, non sono sicuro del perché, ma penso che sia perché il
Set @sql =
è a sinistra del segno di uguale.
Anche la sensibilità alle maiuscole causerà questo problema.
@MyVariable e @myvariable sono le stesse variabili in SQL Server Man. Studio e funzioneranno. Tuttavia, queste variabili risulteranno in un "Deve dichiarare la variabile scalare "@MyVariable" in Visual Studio (C#) a causa delle differenze di sensibilità alle maiuscole.