@RowFrom int
@RowTo int
sont tous deux des paramètres d’entrée globaux pour la procédure stockée, et comme je compile la requête SQL dans la procédure stockée avec T-SQL, puis en utilisant Exec(@sqlstatement)
à la fin de la procédure stockée pour afficher le résultat, cela me donne cette erreur lorsque je tente utilisez le @RowFrom
ou @RowTo
dans la variable @sqlstatement
qui est exécutée .. cela fonctionne très bien sinon .. s'il vous plaît aidez-nous.
"Must declare the scalar variable "@RowFrom"."
De plus, j'ai essayé d'inclure les éléments suivants dans la variable @sqlstatement
:
'Declare @Rt int'
'SET @Rt = ' + @RowTo
mais @RowTo
ne passe toujours pas sa valeur à @Rt
et génère une erreur.
Vous ne pouvez pas concaténer un int à une chaîne. Au lieu de:
SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + @RowTo;
Vous avez besoin:
SET @sql = N'DECLARE @Rt INT; SET @Rt = ' + CONVERT(VARCHAR(12), @RowTo);
Pour aider à illustrer ce qui se passe ici. Disons @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;
Afin de construire cela dans une chaîne (même si finalement ce sera un nombre), je dois le convertir. Mais comme vous pouvez le constater, le nombre est toujours traité comme un nombre lorsqu’il est exécuté. La réponse est 25, non?
Dans votre cas, vous n'avez pas vraiment besoin de re-déclarer @Rt etc. dans la chaîne @sql, il vous suffit de dire:
SET @sql = @sql + ' WHERE RowNum BETWEEN '
+ CONVERT(VARCHAR(12), @RowFrom) + ' AND '
+ CONVERT(VARCHAR(12), @RowTo);
Bien qu’il soit préférable d’avoir un paramétrage approprié, par ex.
SET @sql = @sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
EXEC sp_executesql @sql,
N'@RowFrom INT, @RowTo INT',
@RowFrom, @RowTo;
Juste pour votre information, je sais que ceci est un ancien post, mais en fonction des paramètres de COLLATION de la base de données, vous pouvez obtenir cette erreur sur une déclaration comme celle-ci,
SET @sql = @Sql + ' WHERE RowNum BETWEEN @RowFrom AND @RowTo;';
si, par exemple, vous tapez le S dans le
SET @sql = @***S***ql
désolé d’annuler les réponses déjà publiées ici, mais c’est un exemple concret de l’erreur signalée.
Notez aussi que l’erreur n’affichera pas le S majuscule dans le message, je ne sais pas pourquoi, mais je pense que c’est parce que le
Set @sql =
est à gauche du signe égal.
Ajoutant simplement ce qui a été corrigé pour moi, où la faute de frappe est le suspect selon ce blog MSDN ...
Lors du fractionnement de chaînes SQL sur plusieurs lignes, vérifiez que vous séparez votre chaîne SQL de vos paramètres par une virgule (et que vous n'essayez pas de les concaténer!) Et que vous ne manquez aucun espace à la fin de chaque ligne fractionnée. Pas sorcier, mais j'espère que je sauverai un mal de tête à quelqu'un.
Par exemple:
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;
Vous pouvez également obtenir ce message d'erreur si une variable est déclarée avant une GO
et référencée après.
Voir cette question et cette solution de contournement .
La sensibilité à la casse posera également ce problème.
@MyVariable et @myvariable sont les mêmes variables dans SQL Server Man. Studio et travaillera. Toutefois, ces variables génèrent un "Doit déclarer la variable scalaire" @MyVariable "dans Visual Studio (C #) en raison de différences de respect de la casse.
Juste une réponse pour mon avenir (peut-être que cela aide aussi quelqu'un d'autre!). Si vous essayez d'exécuter quelque chose comme ceci dans l'éditeur de requête:
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'
Et vous obtenez l'erreur:
Doit déclarer la variable scalaire "@year"
C'est parce que vous essayez d'exécuter un tas de code qui inclut LES DEUX l'exécution de la procédure stockée ET la requête située en dessous (!). Sélectionnez simplement celui que vous voulez exécuter ou supprimez/commentez celui qui ne vous intéresse pas.