J'ai un curseur défini comme suit:
DECLARE idCursor CURSOR
FOR SELECT DISTINCT [id], [data]
FROM #tempTable
Et j'ai une variable définie comme suit:
DECLARE @currentId TABLE (
[id] int,
[data] char(1)
);
Mais quand j'essaie de chercher le résultat suivant dans @currentId
FETCH NEXT FROM idCursor INTO @currentId
Je reçois cette erreur:
Must declare the scalar variable "@currentId".
Comment puis-je obtenir le résultat d'un curseur récupérer dans une table? Je comprends que je peux déclarer deux variables et stocker les résultats individuellement. Mais pour une table avec de nombreuses colonnes qui prendraient du temps.
Non, vous ne pouvez pas récupérer des valeurs scalaires d'une ligne de curseur dans une variable de table. Vous devriez déclarer les variables, les récupérer, puis insérer:
FETCH NEXT FROM idCursor INTO @id, @data;
INSERT @currentId([id],[data]) SELECT @id, @data;
Cependant, c'est peut-être le cas que vous n'avez pas besoin d'un curseur du tout. Pourquoi traitez-vous une ligne à la fois? Pourquoi ne peupler pas le @table
variable avec toute requête peuplée à l'origine #tempRemaining
?
INSERT @currentId([id], [data])
SELECT DISTINCT [id], [data]
FROM #tempTable;
Ou même juste en utilisant #tempTable
seul et sauter la variable de table complètement? Peut-être même sauter la table #temp? Un curseur combiné avec une variable de table et A #TEpp table sonne juste comme un cauchemar.
Au risque de sonner comme Celko, cela ressemble beaucoup à la transformation de fichiers plats des années 1970 ... et cela est encore pire qu'il y a tant de colonnes qui déclarent que ces variables serait prohibitive.
Exemple simple à l'aide du curseur:
DECLARE @CustomerID as INT;
declare @msg varchar(max)
DECLARE @BusinessCursor as CURSOR;
SET @BusinessCursor = CURSOR FOR
SELECT CustomerID FROM Customer WHERE CustomerID IN ('3908745','3911122','3911128','3911421')
OPEN @BusinessCursor;
FETCH NEXT FROM @BusinessCursor INTO @CustomerID;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @msg = '{
"CustomerID": "'+CONVERT(varchar(10), @CustomerID)+'",
"Customer": {
"LastName": "LastName-'+CONVERT(varchar(10), @CustomerID) +'",
"FirstName": "FirstName-'+CONVERT(varchar(10), @CustomerID)+'",
}
}|'
print @msg
FETCH NEXT FROM @BusinessCursor INTO @CustomerID;
END