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 :

récupération des valeurs de la table temporaire INSERTED lors d'un trigger after update [2005]


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 7
    Points : 7
    Points
    7
    Par défaut récupération des valeurs de la table temporaire INSERTED lors d'un trigger after update
    Bonjour,

    Je doit mettre à jour une ligne dans une table suite à la modification d'une autre ligne de cette même table.
    Je vous passe le détail sur la sélection de la ligne à modifier, mon problème est dans la récupération des valeurs de la table temporaire INSERTED.
    Le code ci-dessous fonctionne mais n'est ni beau ni performant, je répète n fois le select ... from inserted.
    Existe-t-il un moyen plus rapide d'assigner aux colonnes à mettre à jour les valeurs des colonnes respectives du résultat du select ... from inserted?

    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
    ALTER TRIGGER [dbo].[UPDATE_ORDERLINE_CA]
       ON  [dbo].[COMCLIDETCCD] 
       AFTER UPDATE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
    	declare @NumLigOrigine int 
    	set @NumLigOrigine = (select NUMLIGCCD from inserted where REFSOCCCD in ('AG','CH') and (IDNOTECCD is null or IDNOTECCD = ''))
    	if @NumLigOrigine <> 0 
    	begin
    		-- Chercher la clé unique où trouver le n° de commande de la ligne 'CA'
    		declare @CleUniCCH varchar(8)
    		set @CleUniCCH	= (select REFSOCCCD + cast(NUMCMDCCD as varchar(6)) from inserted where NUMLIGCCD = @NumLigOrigine)
    		-- Chercher le n° de commande de la ligne 'CA' 
    		declare @NumCmdCA int
    		set @NumCmdCA	= (select substring(dbo.COMCLIHEACCH.CMDASMCCH,3,6) from dbo.COMCLIHEACCH where CLEUNICCH = @CleUniCCH)
    		-- Chercher le n° de la ligne 'CA' 
    		declare @NumLigneCA int
    		set @NumLigneCA	= (select LIGCMDCCD from inserted where NUMLIGCCD = @NumLigOrigine)
     
    		if @NumLigOrigine <> 0 and @NumCmdCA <> 0 and @NumLigneCA <> 0
    		begin
    			-- Dupliquer la ligne de commande AG ou CH en ligne CA (en évitant de dupliquer les lignes provenant de Lotus notes qui le sont déjà, dupliquées)
    			update [dbo].[COMCLIDETCCD] set
    			MAJUTICCD=(select MAJUTICCD from inserted where NUMLIGCCD = @NumLigOrigine),
    			MAJDATCCD=(select MAJDATCCD from inserted where NUMLIGCCD = @NumLigOrigine),
    			MAJHEUCCD=(select MAJHEUCCD from inserted where NUMLIGCCD = @NumLigOrigine),
    			REFSOCCCD=(select REFSOCCCD from inserted where NUMLIGCCD = @NumLigOrigine),
                            ...
    			LOTEMBCCD=(select LOTEMBCCD from inserted where NUMLIGCCD = @NumLigOrigine)
    			where CLEUNICCD = 'CA' + cast(@NumCmdCA as varchar(6)) + REPLICATE('0', 2 - LEN(CAST(@NumLigneCA AS VARCHAR(2)))) + CAST(@NumLigneCA AS VARCHAR(2))
    		end
    	end
    END
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Hello,

    Quelque chose dans le genre qui remplacerait ton curseur (je préviens à vérifier j'ai fait cela entre 2 présentations dans un meeting super intéressant ... )

    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
    WITH CTE
    	AS
    	(
    		SELECT 
    			i1.REFSOCCCD + cast(i1.NUMCMDCCD AS varchar(6)) AS CleUniCCH, -- clé unique 
    			substring(COMCLIHEACCH.CMDASMCCH,3,6) AS numCdCA,             -- n° de commande de la ligne 'CA'
    			i1.*									              -- n° de la ligne 'CA'
    		FROM inserted  as i1
    			JOIN dbo.COMCLIHEACCH AS COMCLIHEACCH
    				ON COMCLIHEACCH.CLEUNICCH = i1.REFSOCCCD + cast(i1.NUMCMDCCD AS varchar(6)) 
    		WHERE i1.NUMLIGCCD = (SELECT NUMLIGCCD 
    							  FROM inserted 
    							  WHERE REFSOCCCD IN ('AG','CH') 
    								AND (IDNOTECCD IS NULL 
    									OR IDNOTECCD = ''))
    	)
    	UPDATE COMCLIDETCCD
    	SET MAJUTICCD= i1.MAJUTICCD,
    		MAJDATCCD= i1.MAJDATCCD,
    		MAJHEUCCD= i1.MAJHEUCCD,
    		REFSOCCCD= i1. REFSOCCCD,
            ...
    		LOTEMBCCD= i1.LOTEMBCCD
    	FROM [dbo].[COMCLIDETCCD] AS COMCLIDETCCD
    		JOIN CTE
    			ON 'CA' + CTE.numCdCA + REPLICATE('0', 2 - LEN(CAST(LIGCMDCCD AS VARCHAR(2)))) + CAST(LIGCMDCCD AS VARCHAR(2)) = COMCLIDETCCD.CLEUNICCD
    ++

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2013
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    SUPER! Ça fonctionne très bien, juste une petite correction, il fallait lire CTE à la place de i1 dans l'update, mais même sans présentation dans la journée, j'aurai été incapable de pondre ça aussi bien et rapidement.
    Merci beaucoup.

    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
    WITH CTE
    	AS
    	(
    		SELECT 
    			i1.REFSOCCCD + cast(i1.NUMCMDCCD AS varchar(6)) AS CleUniCCH,	-- clé unique 
    			substring(COMCLIHEACCH.CMDASMCCH,3,6) AS numCdCA,				-- n° de commande de la ligne 'CA'
    			i1.*															-- n° de la ligne 'CA'
    		FROM inserted  AS i1
    			JOIN dbo.COMCLIHEACCH AS COMCLIHEACCH
    				ON COMCLIHEACCH.CLEUNICCH = i1.REFSOCCCD + cast(i1.NUMCMDCCD AS varchar(6)) 
    		WHERE i1.NUMLIGCCD = (SELECT NUMLIGCCD 
    							  FROM inserted 
    							  WHERE REFSOCCCD IN ('AG','CH') 
    								AND (IDNOTECCD IS NULL 
    									OR IDNOTECCD = ''))
    	)
    	UPDATE COMCLIDETCCD
    	SET MAJUTICCD=CTE.MAJUTICCD,
    		MAJDATCCD=CTE.MAJDATCCD,
                    ...		
                    LOTEMBCCD=CTE.LOTEMBCCD
    	FROM [dbo].[COMCLIDETCCD] AS COMCLIDETCCD
    		JOIN CTE
    			ON 'CA' + CTE.numCdCA + REPLICATE('0', 2 - LEN(CAST(CTE.LIGCMDCCD AS VARCHAR(2)))) + CAST(CTE.LIGCMDCCD AS VARCHAR(2)) = COMCLIDETCCD.CLEUNICCD
     
    END

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

Discussions similaires

  1. [MySQL] Récupération des valeurs d'une table entière
    Par danydan01 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 10/05/2011, 10h48
  2. [MySQL] Récupération des valeurs d'une table
    Par pasc06 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 25/11/2008, 23h06
  3. Insertion des enregistrements d'une table temporaire dans un état
    Par Chayanne47 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 18/04/2008, 11h46
  4. Réponses: 3
    Dernier message: 21/05/2007, 15h37
  5. [struts] [checkbox] récupération des valeurs cochées
    Par abourell dans le forum Struts 1
    Réponses: 16
    Dernier message: 10/06/2005, 20h58

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