2008-10-04 10 views
0

Comment puis-je réinitialiser la variable @@ FETCH_STATUS ou la mettre à 0 dans une procédure stockée?Réinitialiser @@ procédure stockée FETCH_STATUS

De plus, pouvez-vous lier FETCH_STATUS à un curseur particulier?

+0

Pourriez-vous expliquer pourquoi ce comportement serait souhaitable? Peut-être que la communauté peut résoudre votre besoin d'une manière différente. –

Répondre

1

Vous pouvez le réinitialiser en lisant un curseur qui n'est pas à la fin d'un tableau.

+0

Une autre question connexe que j'ai est pouvez-vous lier FETCH_STATUS à un curseur particulier? – test

0

Vous ne pouvez pas:

@@ FETCH_STATUS (Transact-SQL)

Renvoie l'état du dernier curseur FETCH émis contre un curseur actuellement ouvert par la connexion.

Donc, fondamentalement, il n'est lié à aucun curseur.

0

Comme Sklivvz a écrit que vous ne pouvez pas. Mais je me demande pourquoi voulez-vous le réinitialiser?

Quel est le vrai problème?

0

Généralement vous avez un @@ FETCH_STATUS immédiatement après un FETCH, alors pourquoi voudriez-vous le réinitialiser? Essayez de stocker son résultat dans une variable temporaire si vous n'évaluez pas immédiatement.

0

Si vous voulez briser le curseur Vous pouvez utiliser BREAK
Mais cela ne remplacera uniquement la fonction de 0 à 1.

fetch next 
While @@fetch_Status = 0 
begin 

if (my condition) 
break 
fetch next ; 

end 
1

Vous devez fermer le curseur, puis ouvrez à nouveau le curseur.

DECLARE @IDs int 
DECLARE MyCursor CURSOR FOR(SELECT ID FROM Table) 
OPEN MyCursor 
FETCH NEXT FROM MyCursor INTO @IDs 
WHILE @@FETCH_STATUS=0 
BEGIN 
    --Do your work(First loop) 
FETCH NEXT FROM MyCursor INTO @IDs 
END 
CLOSE MyCursor 
--Run the cursor again 
OPEN MyCursor 
FETCH NEXT FROM MyCursorINTO @IDs 
WHILE @@FETCH_STATUS=0 
BEGIN 
    --Other work (Second loop) 
    FETCH NEXT FROM MyCursor INTO @IDs 
END 
CLOSE MyCursor 
DEALLOCATE MyCursor 
0

J'ai eu ce que je pensais être un besoin de réinitialiser mon curseur. Je faisais des tests avec des curseurs et je revenais avec un @@ fetch_status being = -1, même après avoir codé une fermeture et une désallocation au curseur que je testais. Ce qui était arrivé était que j'avais ouvert un curseur global dans une autre procédure après un test logique et que je n'avais jamais fermé ce curseur après l'avoir parcouru. Ainsi, Fetch voyait le @@ Fetch_status de ce curseur.

Fermez vos curseurs, libérez vos curseurs.

2

Je suis en mesure de reproduire le problème @@FETCH_STATUS que vous décrivez, c'est une fois que vous DECLARE un CURSOR et itérer les lignes en appelant FETCH NEXT jusqu'à ce que votre @@FETCH_STATUS = -1.
Ensuite, même si vous CLOSE et DEALLOCATE votre curseur, si vous appelez cela CURSOR retour votre @@FETCH_STATUS = -1 et si vous basez une condition de boucle sur le @@FETCH_STATUS <> -1, votre boucle ne s'exécute jamais.

Ma solution a été de dire essentiellement le CURSOR pour revenir à FIRST, en changeant le @@FETCH_STATUS retour à 0, puis sortir. Notez que vous devez activer le CURSOR pour faire défiler en ajoutant le mot-clé SCROLL après le nom CURSOR lorsque vous le déclarez.

Voici un exemple. J'ai utilisé trois colonnes d'un OrderItems (articles ont placé des commandes pour) table pour créer mon curseur:

USE transact_Sales; 

GO 

DECLARE @isOrderNumber INT; 
DECLARE @isOrderTotal MONEY; 
DECLARE test SCROLL CURSOR 
FOR 
SELECT Oi.order_num, SUM([email protected]_price) FROM orderitems AS Oi GROUP BY order_num; 

OPEN test; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
FETCH NEXT FROM test INTO @isOrderNumber, @isOrderTotal 
PRINT CAST(@isOrderNumber AS VARCHAR(20)) + ' ' 
    +CAST(@isOrderTotal AS VARCHAR(20)) + ' ' 
    +CAST(@@FETCH_STATUS AS VARCHAR(5)) 
END 
FETCH FIRST FROM test INTO @isOrderNumber, @isOrderTotal 

CLOSE test; 
DEALLOCATE test; 

Ce sont les résultats:

20005 149.87 0 
20006 55.00 0 
20007 1000.00 0 
20008 125.00 0 
20009 38.47 0 
20009 38.47 -1 

Le curseur peut être exécuté sur et plus et sera produit les mêmes résultats à chaque fois.

1

Un vieux fil, mais je sais une réponse trouvée ailleurs qui a fonctionné pour moi était:

WHILE (1 = 1) 
BEGIN 
    FETCH NEXT FROM mycursor INTO @somevar 
    IF (@@FETCH_STATUS <> 0) BREAK 
    -- do stuff here 
END 
Questions connexes