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 :

Optimisation Trigger sous SQL Serveur 2000


Sujet :

Développement SQL Server

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 111
    Par défaut Optimisation Trigger sous SQL Serveur 2000
    Je débute en trigger et je suis pas trés douer...
    J'aimerais une petite aide pour optimiser mon trigger qui fonctionne mais qui est pas trés beau a voir...
    Notament l'utilisation de trés nombreuses variables pour stocker les données avant de faire mon INSERT Final dans TCOM_CDEE

    Voici mon super trigger pas du tout optimisé :

    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
     
     
    CREATE TRIGGER TG_INS_SIA12_ENTETE_ECH ON [dbo].[F_DOCENTETE] 
    FOR INSERT
    AS
    	DECLARE @idAuto int, @IdComm int, @NumLiv int
    	DECLARE @NTiers varchar(17), @NomComm varchar(35), @NCom varchar(12)
    	DECLARE @dateComm datetime, @DateLivTot datetime, @DateLivTard datetime
     
    	BEGIN
    		-- On récupére les données qui nous interresse sur la ligne que l'on viens d'insérer
    		SELECT @NCom = DO_Piece, @NTiers = DO_Tiers, @dateComm = DO_Date, @DateLivTot = DO_DateLivr, @DateLivTard = Date_livraison_Maxi, @IdComm = RE_No, @NumLiv = Li_No  FROM INSERTED
     
    		-- On récupére le nom du commercial grace à son id
    		SELECT @NomComm = RE_Nom FROM F_REPRESENT WHERE RE_No = @IdComm
     
    		-- On insére dans T_Echanges la ligne de l'échange.
    		INSERT INTO [T_ECHANGES] (NOM, ORIGINE, DESTINATION, DATE_CREATION, STATUT )  VALUES ('COMMANDE', 'SAGE', 'PRODALIA', GetDate(), 'PRET')
    		-- Permet de récupérer le numéro qui a été incrémenter automatiquement
    		SELECT @idAuto = @@IDENTITY FROM INSERTED
     
    		-- Récupérer les données sur l'adresse de la livraison dans la table  F_LIVRAISON
    		DECLARE @Code_Liv varchar(17), @libelle_Liv varchar(50), @adress_Liv varchar(35), @comple_Liv varchar(35),  @cp_Liv varchar(5), @ville_liv varchar(35),  @pays_Liv varchar(50), @tel_Liv varchar(15), @fax_Liv varchar(15), @mail_Liv varchar(50)
    		SELECT @Code_Liv = CT_Num, @libelle_Liv = LI_INTITULE, @adress_Liv = LI_ADRESSE, @comple_Liv = LI_COMPLEMENT, @cp_Liv = LI_CODEPOSTAL, @ville_liv = LI_VILLE, @pays_Liv = LI_PAYS, @tel_Liv = LI_TELEPHONE, @fax_Liv = LI_TELECOPIE, @mail_Liv = LI_EMAIL FROM F_LIVRAISON WHERE LI_No = @NumLiv
     
    		-- On insére dans TCOM_CDEE l'entete de la facture
    		INSERT INTO [TCOM_CDEE] (IDENTIFIANT, ACTION_ECHANGE, NO_COMMANDE, CODE_CLIENT, LIBELLE_CLIENT, ADRESSE_CLIENT, COMPLEMENT_ADRESSE, CODE_POSTAL_CLIENT, VILLE_CLIENT, PAYS_CLIENT, TELEPHONE, FAX, EMAIL, CODE_SITE, LIBELLE_SITE, ADRESSE_SITE, COMPLEMENT_ADRESSE_SITE, CODE_POSTAL_SITE, VILLE_SITE, PAYS_SITE, TELEPHONE_SITE, FAX_SITE, EMAIL_SITE, Date_commande, Date_livraison_tot, Date_livraison_tard, Representant_code, Representant_nom )
    			SELECT @idAuto, 'A', @NCom, @NTiers, CT_INTITULE, CT_ADRESSE, CT_COMPLEMENT, CT_CODEPOSTAL, CT_VILLE, CT_PAYS, CT_TELEPHONE, CT_TELECOPIE, CT_EMAIL, @Code_Liv, @libelle_Liv, @adress_Liv, @comple_Liv, @cp_Liv, @ville_liv, @pays_Liv, @tel_Liv, @fax_Liv,@mail_Liv, @dateComm, @DateLivTot, @DateLivTard, @IdComm, @NomComm  FROM F_COMPTET WHERE CT_Num = @NTiers
    	END

  2. #2
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

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

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Par défaut
    DECLARE @Code_Liv varchar(17), @libelle_Liv varchar(50), @adress_Liv varchar(35), @comple_Liv varchar(35), @cp_Liv varchar(5), @ville_liv varchar(35), @pays_Liv varchar(50), @tel_Liv varchar(15), @fax_Liv varchar(15), @mail_Liv varchar(50)
    SELECT @Code_Liv = CT_Num, @libelle_Liv = LI_INTITULE, @adress_Liv = LI_ADRESSE, @comple_Liv = LI_COMPLEMENT, @cp_Liv = LI_CODEPOSTAL, @ville_liv = LI_VILLE, @pays_Liv = LI_PAYS, @tel_Liv = LI_TELEPHONE, @fax_Liv = LI_TELECOPIE, @mail_Liv = LI_EMAIL FROM F_LIVRAISON WHERE LI_No = @NumLiv

    -- On insére dans TCOM_CDEE l'entete de la facture
    INSERT INTO [TCOM_CDEE] (IDENTIFIANT, ACTION_ECHANGE, NO_COMMANDE, CODE_CLIENT, LIBELLE_CLIENT, ADRESSE_CLIENT, COMPLEMENT_ADRESSE, CODE_POSTAL_CLIENT, VILLE_CLIENT, PAYS_CLIENT, TELEPHONE, FAX, EMAIL, CODE_SITE, LIBELLE_SITE, ADRESSE_SITE, COMPLEMENT_ADRESSE_SITE, CODE_POSTAL_SITE, VILLE_SITE, PAYS_SITE, TELEPHONE_SITE, FAX_SITE, EMAIL_SITE, Date_commande, Date_livraison_tot, Date_livraison_tard, Representant_code, Representant_nom )
    SELECT @idAuto, 'A', @NCom, @NTiers, CT_INTITULE, CT_ADRESSE, CT_COMPLEMENT, CT_CODEPOSTAL, CT_VILLE, CT_PAYS, CT_TELEPHONE, CT_TELECOPIE, CT_EMAIL, @Code_Liv, @libelle_Liv, @adress_Liv, @comple_Liv, @cp_Liv, @ville_liv, @pays_Liv, @tel_Liv, @fax_Liv,@mail_Liv, @dateComm, @DateLivTot, @DateLivTard, @IdComm, @NomComm FROM F_COMPTET WHERE CT_Num = @NTiers
    en fait tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT @champ1=champ1 from table1
    INSERT INTO table3 (champ3,champ1) SELECT @champ2=champ2,@champ1 from table2

    fais directement


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO table3 (champ3,champ1)
    select champ2 ,champ1 from
    table2 inner join table1 on table1.xx=table2.xx

  3. #3
    Membre émérite
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Par défaut
    tu peux par exemple passer par une table temporaire au lieu de stocker dans des variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT @NCom = DO_Piece, @NTiers = DO_Tiers, @dateComm = DO_Date, @DateLivTot = DO_DateLivr, @DateLivTard = Date_livraison_Maxi, @IdComm = RE_No, @NumLiv = Li_No  FROM INSERTED
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT DO_Piece, DO_Tiers, DO_Date, DO_DateLivr, Date_livraison_Maxi,  RE_No, Li_No INTO #TableTempo FROM INSERTED
    --pour recuperer DO_piece par exemple :
    SELECT do_pieces from #TableTempo
    ca te fera des variables en moins deja.

  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
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Dans un trigger vous ne devez en principe avoir AUCUNE variable. En effet un trigger se déclenche de manière ensembliste, ce qui veut dire que si vous faites un UPDATE qui va porter sur 300 lignes, il ne sera déclenché qu'une seule fois !
    Il va sans dire que votre code donnera n'importe quoi puisqu'une seule ligne (au hasard) sera traitée...

    Il faut donc éradiquer toutes vous variables et les imbriquant dans des requêtes.

    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/ * * * * *

Discussions similaires

  1. deploiement d'une application sous delphi avec sql serveur 2000
    Par cmembre dans le forum Bases de données
    Réponses: 0
    Dernier message: 17/05/2010, 15h01
  2. Requête sous SQL Serveur 2000
    Par ryc28 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 10/12/2007, 16h26
  3. [SQL Serveur 2000] - Trigger gestion erreur
    Par Silvia12 dans le forum Développement
    Réponses: 7
    Dernier message: 12/06/2007, 11h08
  4. [debutant]Plan de maintenance sous sql serveur 2000
    Par christophebmx dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/05/2005, 12h18
  5. Supprimer une colonne sous SQL Serveur 2000
    Par WOLO Laurent dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/07/2003, 12h24

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