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?
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?
Vous pouvez le réinitialiser en lisant un curseur qui n'est pas à la fin d'un tableau.
Une autre question connexe que j'ai est pouvez-vous lier FETCH_STATUS à un curseur particulier? – test
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.
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?
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.
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
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
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.
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.
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
Pourriez-vous expliquer pourquoi ce comportement serait souhaitable? Peut-être que la communauté peut résoudre votre besoin d'une manière différente. –