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 :

Problème de clause OUTPUT [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut Problème de clause OUTPUT
    Hello,

    Je suis certain que ce problème est vraiment con si pas trivial mais je sèche...

    Voici un peu de code :
    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
    DECLARE @DTD TABLE(
                DTD_ID INT PRIMARY KEY,
                NEW_DTD_ID INT,
                CONT_ID INT,
                PRM_ID INT,
                BA_ID TINYINT,
                DTD_PRICE_REDUCTION BIT);
     
            INSERT INTO S_PROMO.T_DETAIL_DEMO_DTD(CONT_ID, PRM_ID, BA_ID, DTD_PRICE_REDUCTION)
            OUTPUT    DTD_ID, INSERTED.DTD_ID, INSERTED.CONT_ID, INSERTED.PRM_ID, INSERTED.BA_ID, INSERTED.DTD_PRICE_REDUCTION 
                INTO @DTD(DTD_ID, NEW_DTD_ID, CONT_ID, PRM_ID, BA_ID, DTD_PRICE_REDUCTION)
            SELECT    CONT_ID,
                    @NEW_PRM_ID,
                    BA_ID,
                    DTD_PRICE_REDUCTION
            FROM    S_PROMO.T_DETAIL_DEMO_DTD
            WHERE    PRM_ID = @PRM_ID
    Cela se place dans le contexte d'une DB qui modélise des promotions. Ce bout de code fait partie d'une procédure servant à faire une copie d'une promo. La table suffixée par DTD est la table contenant les "fournisseurs en démonstration" (c'est plus complexe que ça mais j'en ai pour 3 page à vous expliquer en détail sinon) qui participe à la promo.

    Je fais donc une copie de ceux qui participe à la promo qu'on veut copier (dont l'id est dans @PRM_ID) et j'ai besoin de récupérer le tout car j'ai besoin des nouveaux ID pour faire les copies de lignes dans la table qui références DTD (où stocker les pourcentages auxquels les lignes de DTD sont promotionnées).

    J'ai donc créé une variable table qui contient aussi bien le DTD_ID source et le nouveau DTD_ID que je comptais récupérer via la clause OUTPUT de l'ordre INSERT. Pas de souci pour récupérer le nouvel ID via la pseudo-table INSERTED. Mais pour l'ID "source", pas moyen (la première colonne de la clause OUTPUT). J'ai essayé en donnant un alias à la table DTD et en préfixant DTD_ID par cet alias mais cela ne change rien.

    Les exemples que je trouve ça et là sur le net ne s'occupe que de récupérer les données des pseudo-tables INSERTED et DELETED. Jamais de les associer avec les données sources...

    Comment faut-il donc procéder ??

    EDIT : Je pourrais encore m'en sortir en utilisant la clef alternative que possède la table mais ce serait tellement plus facile si je pouvais récupérer l'id source...
    Kropernic

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Le problème était en effet trivial. En fait, faut pas utiliser INSERT INTO mais MERGE.

    C'est très bien expliqué ici.

    EDIT : Vu que je ne suis pas encore à l'aise avec MERGE, cela vous semble-t-il correct ?
    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
            DECLARE @DTD TABLE(
                DTD_ID INT PRIMARY KEY,
                NEW_DTD_ID INT,
                CONT_ID INT,
                PRM_ID INT,
                BA_ID TINYINT,
                DTD_PRICE_REDUCTION BIT);
     
            MERGE    S_PROMO.T_DETAIL_DEMO_DTD AS TARGET
            USING    (
                    SELECT    DTD_ID,
                            CONT_ID,
                            BA_ID,
                            DTD_PRICE_REDUCTION
                    FROM    S_PROMO.T_DETAIL_DEMO_DTD
                    WHERE    PRM_ID = @PRM_ID
                    ) AS SOURCE
                ON (1=0)
            WHEN NOT MATCHED THEN
                INSERT (CONT_ID, PRM_ID, BA_ID, DTD_PRICE_REDUCTION)
                VALUES (SOURCE.CONT_ID, @NEW_PRM_ID, SOURCE.BA_ID, SOURCE.DTD_PRICE_REDUCTION)
                OUTPUT SOURCE.DTD_ID, INSERTED.DTD_ID, SOURCE.CONT_ID, @NEW_PRM_ID, SOURCE.BA_ID, SOURCE.DTD_PRICE_REDUCTION
                    INTO @DTD(DTD_ID, NEW_DTD_ID, CONT_ID, PRM_ID, BA_ID, DTD_PRICE_REDUCTION);
    Merci d'avance.
    Kropernic

  3. #3
    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,

    Citation Envoyé par Kropernic Voir le message
    C'est très bien expliqué ici.
    C'est aussi expliqué ici


    Le MERGE semble correct.

  4. #4
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Arf... J'avais oublié ce topic. (j'ai pourtant fait une recherche et j'suis pas tombé dessus )

    Comme quoi, ça prouve bien que j'suis pas à l'aise avec MERGE.

    Tiens, pour être sûr...

    Si j'avais mis on (1=1) et WHEN MATCHED THEN, c'était bon aussi ? (me semble que oui mais y a p-e une subtilité qui m'échappe)
    Kropernic

  5. #5
    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
    Non, car on ne peut pas mettre de clause INSERT dans la partie WHEN MATCHED.

  6. #6
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    J'ai bien fait de poser la question !

    Et en y réfléchissant, c'est normal en fait. Si ça matche, c'est qu'il y a déjà une ligne. Donc l'insertion n'a pas de sens.

    Un jour, j'y arriverai sans poser la question .
    Kropernic

  7. #7
    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
    Une autre écriture possible serait celle-ci :

    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
     
            DECLARE @DTD TABLE(
                DTD_ID INT PRIMARY KEY,
                NEW_DTD_ID INT,
                CONT_ID INT,
                PRM_ID INT,
                BA_ID TINYINT,
                DTD_PRICE_REDUCTION BIT);
     
            MERGE    S_PROMO.T_DETAIL_DEMO_DTD AS TARGET
            USING    S_PROMO.T_DETAIL_DEMO_DTD AS SOURCE
                ON (1=0)
            WHEN NOT MATCHED 
                            AND SOURCE.PRM_ID = @PRM_ID
                THEN
                INSERT (CONT_ID, PRM_ID, BA_ID, DTD_PRICE_REDUCTION)
                VALUES (SOURCE.CONT_ID, @NEW_PRM_ID, SOURCE.BA_ID, SOURCE.DTD_PRICE_REDUCTION)
                OUTPUT SOURCE.DTD_ID, INSERTED.DTD_ID, SOURCE.CONT_ID, @NEW_PRM_ID, SOURCE.BA_ID, SOURCE.DTD_PRICE_REDUCTION
                    INTO @DTD(DTD_ID, NEW_DTD_ID, CONT_ID, PRM_ID, BA_ID, DTD_PRICE_REDUCTION);
    Mais cela empêche l'utilisation d'index sur PRM_ID. Votre requete initiale me parait donc plus appropriée...

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

Discussions similaires

  1. Clause OUTPUT avec INSERT
    Par ben-34 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/09/2007, 20h10
  2. [XSLT] Problème de xsl:output
    Par jbrasselet dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 30/08/2007, 15h46
  3. [MySQL] Problème de clause WHERE
    Par PozNo dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 28/05/2007, 21h37
  4. problème doublons clause WHERE
    Par bastoonet dans le forum Designer
    Réponses: 16
    Dernier message: 20/10/2006, 16h41
  5. [requete] Mysql problème de clause where
    Par Raideman dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/07/2005, 19h00

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