web-dev-qa-db-fra.com

Comment chercher à partir d'un curseur dans une variable de table?

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.

3
hazrmard

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.

6
Aaron Bertrand

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
0
Agnel Amodia