2010-06-09 9 views
1

J'ai une situation où j'ai besoin d'exécuter plusieurs fois une procédure stockée Maintenant cette procédure (spMAIN) a un curseur à l'intérieur qui cherche une valeur d'une table comme T1, qui a la structure suivanteExécuter de façon répétée une procédure stockée

ID  Status 
---- -------- 
1  New 
2  New 
3  success 
4  Error 

maintenant le curseur regarde pour toutes les lignes avec un statut de « nouveau »

maintenant tout traitement, si cette instance du curseur rencontre une erreur, un autre SP dire spError doit être appelée, le « statut » la colonne dans T1 doit être mise à jour en 'Error' et spMAIN doit être appelé à nouveau, ce qui répète le processus, en recherchant des lignes avec 'new'

Comment puis-je le faire? De même, aussi, pendant que nous y sommes, si un SP a d'autres SP à l'intérieur et si l'un de ces SP soulève une erreur, la même chose doit être faite, la table T1 doit être mise à jour ('Error') et spMAIN doit être appelé à nouveau.

pouvez-vous également recommander quelque chose?

est ici un code

ALTER PROC zzSpMain 
AS 
    BEGIN 
     DECLARE @id INT 
     BEGIN TRY 
     IF EXISTS (SELECT * 
        FROM  dbo.zzTest 
        WHERE istatus = 'new') 
      BEGIN 


       DECLARE c CURSOR 
        FOR SELECT id 
         FROM zztest 
         WHERE istatus = 'new' 

       OPEN c 
       FETCH NEXT FROM c INTO @id 

       WHILE @@FETCH_STATUS = 0 
        BEGIN 
        PRINT @id 


        IF @id = 2 
         BEGIN   
          UPDATE zztest 
          SET  istatus = 'error' 
          WHERE id = @id 
          RAISERROR ('Error occured', 16, 
           1) 
         END 

        UPDATE zztest 
        SET  istatus = 'processed' 
        WHERE id = @id 

        FETCH NEXT FROM c INTO @id 
        END 
       CLOSE c 
       DEALLOCATE c 

      END 

     END TRY 
     begin CATCH 

     EXEC zzSpError 
     END CATCH 

    END 
+4

Chaque fois que je vois un curseur que je suis habituellement certain qu'il existe une meilleure façon de le faire-style SGBDR-ensemble plus ce qui est nécessaire. – Joe

Répondre

2

Vous pouvez effectuer la gestion des erreurs avec la fonctionnalité ESSAYER CATCH qui est intégré à SQL Server à partir de SQL Server 2005. Je vous recommande de réévaluer votre logique de requête et rechercher à quelque chose comme le CLR SQL ou une déclaration MERGE. A en juger par l'exemple de code, cela devrait être une voie particulièrement facile à prendre.

2

Tout ce cadre semble bien, donc je ne suis pas sûr de ce que votre problème est (TRY/CATCH et relancer les erreurs si vous avez beaucoup de SP imbriqués).

Cependant,, les approches basées sur les ensembles sont préférées. Si vous pouviez donner plus de vos besoins, nous pourrions probablement suggérer quelque chose de plus facile. Généralement, pour les scénarios de type sondage, j'utilise généralement un travail d'agent qui fonctionne sur l'ensemble des nouvelles lignes (avec un curseur), ou vous pouvez leur attribuer un numéro de lot et commencer le traitement de ce lot. Lorsque la tâche d'agent suivante se déclenchera, seules les nouvelles lignes sans lot recevront un autre lot qui sera supprimé et traité.

Mais sans en savoir plus sur votre motivation sous-jacente ...

Questions connexes