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
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