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
ainsi que l'erreur
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
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".
Partager