Salut !

Je déroule un curseur dans une procédure stockée mais tous mes éléments ne sont pas traités bien que je passe le bon nombre de fois dans la boucle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
CREATE PROCEDURE _FF_CTA_ctrl_Abonnements
AS
	SET NOCOUNT ON

	DECLARE @cabonnement CHAR(8)
	DECLARE @nb_abonnements INT

	DECLARE curs_abo_à_contrôler INSENSITIVE CURSOR FOR SELECT CAbonnement FROM CTA_Abonnement WHERE NAnomalies IS NULL

	OPEN curs_abo_à_contrôler
	SELECT @nb_abonnements = @@CURSOR_ROWS

	FETCH NEXT FROM curs_abo_à_contrôler INTO @cabonnement

	DECLARE @dcréation SMALLDATETIME
	DECLARE @drésiliation SMALLDATETIME
	DECLARE @ctarif CHAR(6)
	DECLARE @nabopere CHAR(8)
	DECLARE @cli CHAR(9)
	DECLARE @pconsommation SMALLDATETIME

	DECLARE @ok BIT

	SELECT @ok = 0

	DECLARE @erreur INT,@nombre INT

	DECLARE @dfin SMALLDATETIME

	SELECT @dfin = Fin FROM CTA_Période

	DECLARE @nb_passes INT

	SELECT @nb_passes = 0

	WHILE (@@FETCH_STATUS = 0)
	BEGIN
		SELECT
			@dcréation = DCréation
			,@drésiliation = DRésiliation
			,@ctarif = CTarif
			,@nabopere = NAboPere
			,@cli = CLI
			,@pconsommation = PConsommation
		FROM CTA_Abonnement_Détails
		WHERE CAbonnement = @cabonnement

		IF @dcréation >= @drésiliation
		BEGIN
			EXECUTE _FF_CTA_set_Anomalie @cabonnement = @cabonnement, @canomalie = 'DCR'
			SELECT @ok = 1
			SELECT @nb_abonnements = @nb_abonnements-1
		END

		IF LEFT(RTRIM(LTRIM(@ctarif)),3) = 'COR'
		BEGIN
			EXECUTE _FF_CTA_set_Anomalie @cabonnement = @cabonnement, @canomalie = 'COR'
			SELECT @ok = 1
			SELECT @nb_abonnements = @nb_abonnements-1
		END

		IF LEN(RTRIM(LTRIM(@nabopere))) > 0 AND LEN(RTRIM(LTRIM(@cli))) = 0
		BEGIN
			EXECUTE _FF_CTA_set_Anomalie @cabonnement = @cabonnement, @canomalie = 'CLI'
			SELECT @ok = 1
			SELECT @nb_abonnements = @nb_abonnements-1
		END

		IF @pconsommation IS NULL OR @pconsommation > @dfin
		BEGIN
			EXECUTE _FF_CTA_set_Anomalie @cabonnement = @cabonnement, @canomalie = 'PCO'
			SELECT @ok = 1
			SELECT @nb_abonnements = @nb_abonnements-1
		END

		IF @ok = 0
		BEGIN
			EXECUTE _FF_CTA_set_Anomalie @cabonnement = @cabonnement, @canomalie = 'AOK'
			SELECT @nb_abonnements = @nb_abonnements-1
		END

		SELECT @nb_passes = @nb_passes+1

		FETCH NEXT FROM curs_abo_à_contrôler INTO @cabonnement
	END

	PRINT 'Nb non traités : ' + CAST(@nb_abonnements AS VARCHAR(20))
	PRINT 'Nb passes : ' + CAST(@nb_passes AS VARCHAR(20))

	CLOSE curs_abo_à_contrôler
	DEALLOCATE curs_abo_à_contrôler
GO
La sous-procédure utilisée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE PROCEDURE _FF_CTA_set_Anomalie
	@cabonnement CHAR(8),@canomalie CHAR(3)
AS
	SET NOCOUNT ON
 
	DECLARE @abonnement_id INT,@anomalie_id INT
 
	IF @canomalie = 'AOK'
		UPDATE CTA_Abonnement SET NAnomalies = 0 WHERE CAbonnement = @cabonnement
	ELSE
	BEGIN
		SELECT @abonnement_id = Identifiant FROM CTA_Abonnement WHERE CAbonnement = @cabonnement
 
		SELECT @anomalie_id = Identifiant FROM CTA_Anomalie WHERE CAnomalie = @canomalie
 
		INSERT INTO CTA_Abonnement_Anomalie (Abonnement,Anomalie) VALUES (@abonnement_id,@anomalie_id)
 
		UPDATE CTA_Abonnement SET NAnomalies = ISNULL(NAnomalies,0) + 1 WHERE CAbonnement = @cabonnement
	END
GO
Cela me donne le résultat suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Nb non traités : 23405
Nb passes : 29368
Je sèche, quelqu'un a une idée ? Je dois passer à côté de quelque chose mais je vois pas quoi ...