Bonjour,

je souhaite utiliser la position courante d'un curseur dans une procédure stockée dans laquelle je construis dynamiquement mes requêtes car elles font référence à une colonne que je crée, puis supprime dans cette même procédure stockée.

Mais j'ai une erreur, qui ne m'étonne pas trop, car j'utilise une sp_executesql qui ne connait pas mon curseur.
Ai-je la possibilité de m'en soritr? Et si oui, comment.

D'avance, merci pour vos pistes et éclairages.

Voici la procédure
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
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Auteur:		<XOF>
-- Date de création: <11 Novembre 2018>
-- Description:	<Supprime les doublons de la table [1L_Portail_Profils_Utilisateur]>
-- =============================================
ALTER PROCEDURE [1Lsp_Verification_Doublons_PK_1L_Portail_Profils_Utilisateurs_1L_Portail_Profils] 
AS
BEGIN
	SET NOCOUNT ON;
	DECLARE @i INT
	DECLARE @IDFugace INT
	DECLARE @NomColonne nvarchar(100)
	DECLARE @SRequeteSQLLecture nvarchar(4000)
	DECLARE @SRequeteSQLUpdate nvarchar(4000)
	set @NomColonne='[1L_IDFugace]'
    IF EXISTS (
		SELECT COUNT(*) AS Nombre, idProfil,IDUtilisateur
			FROM   [1L_Portail_Profils_Utilisateur]
			GROUP  BY idProfil,IDUtilisateur
			HAVING COUNT(*) > 1
			)
		BEGIN
			--*****************************************--
			-- Il y a des doublons à supprimer...
			--*****************************************--
			-- On ajoute une colonne que l'on supprimera en fin de procédure
			ALTER TABLE [1L_Portail_Profils_Utilisateur] ADD [1L_IDFugace] INT;
			--	On parcours toute la table pour l'ID
			--	On construit dynamiquement le cuseur car la colonne n'est pas connue dans le MCD
			--	On vient juste de la créer fugacement
			set @SRequeteSQLLecture=N'SET @CURSEUR_DOUBLON = CURSOR FOR SELECT '+@NomColonne+N' FROM [1L_Portail_Profils_Utilisateur] OPEN @CURSEUR_DOUBLON'
 
			SET @i = 1
 
			DECLARE @CURSEUR_DOUBLON CURSOR
			EXEC sp_executesql @SRequeteSQLLecture, N'@CURSEUR_DOUBLON cursor OUTPUT', @CURSEUR_DOUBLON OUTPUT
 
			FETCH NEXT FROM @CURSEUR_DOUBLON INTO @IDFugace
 
			WHILE @@FETCH_STATUS = 0
			BEGIN
				set @SRequeteSQLUpdate= N'UPDATE [1L_Portail_Profils_Utilisateur] SET [1L_IDFugace] = '+cast(@i as varchar(10))+N' WHERE  CURRENT OF @CURSEUR_DOUBLON'
				print @SRequeteSQLUpdate
				EXEC sp_executesql @SRequeteSQLUpdate
			   SET @i = @i + 1
 
			   FETCH NEXT FROM @CURSEUR_DOUBLON INTO @IDFugace  
 
			END
 
			CLOSE @CURSEUR_DOUBLON
 
			DEALLOCATE @CURSEUR_DOUBLON
			-- On supprime les doublons-triplons etc ...
 
 
			-- Suppression de la colonne fugace
			--ALTER TABLE [1L_Portail_Profils_Utilisateur] DROP COLUMN [1L_IDFugace];
		END
	ELSE
	BEGIN 
		-- Il n'y a pas de doublon à traiter ...
		PRINT 'Faut rien faire '
	END
END
GO
ainsi que l'erreur

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
UPDATE [1L_Portail_Profils_Utilisateur] SET [1L_IDFugace] = 1 WHERE  CURRENT OF @CURSEUR_DOUBLON
Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@CURSEUR_DOUBLON".