IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Utilisation de la position courante d'un curseur dans une PS [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut Utilisation de la position courante d'un curseur dans une PS
    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".
    Cordialement,
    Christophe Charron

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tu cherches à faire quoi avec cette usine à gaz.
    J'ai l'impression que tu cumules les mauvaises pratiques pour faire quelque chose de simple...

  3. #3
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut
    Merci d'avoir pris le temps de me lire.
    J'essaie de déterminer l'utilisabilité, dans un cas très simple, d'un curseur avec deux requêtes dynamiques.
    Cordialement,
    Christophe Charron

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    La solution ensembliste suivante sera mille fois plus rapide pour éradiquer vos doublons que l'utilisation de cur :

    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
    CREATE SEQUENCE SEQ_DOUBLONS;
     
    ALTER TABLE [1L_Portail_Profils_Utilisateur] ADD [1L_IDFugace] BIGINT;
     
    UPDATE [1L_Portail_Profils_Utilisateur]
    SET [1L_IDFugace] = NEXT VALUE FOR SEQ_DOUBLONS;
     
    DELETE FROM T 
    FROM [1L_Portail_Profils_Utilisateur] AS T
    WHERE  EXISTS(SELECT *
                  FROM   [1L_Portail_Profils_Utilisateur] AS TT
                  WHERE  T.idProfil = TT.idProfil AND T.IDUtilisateur = TT.IDUtilisateur
                  HAVING T.[1L_IDFugace] > MIN(TT.[1L_IDFugace]));
     
    DROP SEQUENCE SEQ_DOUBLONS;
    Bien entendu il faudrait faire cela dans une procédure stockées transactionné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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    CREATE PROCEDURE P_DELETE_DOUBLONS
    AS
     
    SET NOCOUNT ON;
     
    BEGIN TRANSACTION;
     
    BEGIN TRY
     
       CREATE SEQUENCE SEQ_DOUBLONS;
     
       EXEC ('ALTER TABLE [1L_Portail_Profils_Utilisateur] ADD [1L_IDFugace] BIGINT;');
     
       EXEC ('UPDATE [1L_Portail_Profils_Utilisateur] SET [1L_IDFugace] = NEXT VALUE FOR SEQ_DOUBLONS;')
     
       EXEC ('DELETE FROM T 
              FROM [1L_Portail_Profils_Utilisateur] AS T
              WHERE  EXISTS(SELECT *
                            FROM   [1L_Portail_Profils_Utilisateur] AS TT
                            WHERE  T.idProfil = TT.idProfil AND T.IDUtilisateur = TT.IDUtilisateur
                            HAVING T.[1L_IDFugace] > MIN(TT.[1L_IDFugace]));');
       EXEC ('ALTER TABLE [1L_Portail_Profils_Utilisateur] DROP COLUMN [1L_IDFugace]');
     
       DROP SEQUENCE SEQ_DOUBLONS;
     
       COMMIT;
     
    END TRY
    BEGIN CATCH
       IF XACT_STATE() <> 0
          ROLLBACK;
       THROW;
    END CATCH
     
    GO
    la lancer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXEC P_DELETE_DOUBLONS
    A +

    PS - pour vous former à SQL Server :
    https://www.amazon.fr/SQL-Server-201...dp/2212135920/
    Nom : Couverture livre SQL server Eyrolles.jpg
Affichages : 111
Taille : 105,0 Ko
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut
    Merci Frédéric, pour votre réponse.
    La suppression des doublons n'était qu'un prétexte pour explorer la position courante du curseur.
    J'avais bien lu votre article sur les doublons https://sqlpro.developpez.com/cours/doublons/ et procédé en fonction.

    Mais il n'empêche que j'aimerais bien savoir s'il est envisageable d'imbriquer l'exécution d'une requête "dynamique" qui puisse utiliser la position de curseur courante
    Cordialement,
    Christophe Charron

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Dans ce cas il faut tout faire en SQL dynamique y compris l'implémentation du curseur.

    Bon courage

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut
    Bonjour,

    le "Bon courage", de votre part m'incline à remettre à un peu plus tard cette expérimentation que je pressens ardue, en l'état actuel de mes capacités.

    Merci d'avoir pris le temps de répondre.
    Cordialement,
    Christophe Charron

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Et oui, l'utilisation de curseur en mode SQL dynamique est possible. Comme l'utilisation des curseurs est généralement une grosse merde, let le SQL dynamique une deuxième grosse merde, le tout est une grosse merde ²... !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Cela dit, il y a bien plus simple pour supprimer les doublons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    WITH CTE AS (
    SELECT ROW_NUMBER() OVER(PARTITION BY [critère de détection de doublon] ORDER BY [critère de sélection de doublon à supprimer]) AS RN
    FROM LaTable
    )
    DELETE FROM CTE 
    WHERE RN > 1

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Justement c'est cela qu'il n'a pas : "critère de détection de doublon" !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. recuperer la position x y du curseur dans une texte area
    Par nsanabi dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 26/03/2009, 12h31
  2. [vb]position du curseur dans une zone définie
    Par maxdwarf dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 28/02/2007, 06h54
  3. Position en pixel du curseur dans un TextBox
    Par nihaoma dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/02/2007, 13h51
  4. [VB6] position du curseur dans une zone texte et insertion caractere
    Par tim69000 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 05/05/2006, 09h52
  5. Obtenir la position du curseur dans une Image
    Par bastoune dans le forum Composants VCL
    Réponses: 6
    Dernier message: 14/11/2003, 21h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo