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 :

INSERT INTO OUTPUT INSERTED.pk


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 35
    Par défaut INSERT INTO OUTPUT INSERTED.pk
    Bonjour,

    Je cherche à récupérer automatiquement les identity générées dans un lot d'INSERT afin de conserver la relation dans une table externe des clés de la table emettrice avec la table receptrice

    Mon problème se situe sur le fait que je n'arrive pas à ajouter dans l'OUTPUT une colonne appartenant à la table emettrice et n'appartenant pas aux colonnes de la table réceptrice

    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
    Createtable TableEntree
    (
                 [CodeSource] intidentity (1,1),
                 [libelle] varchar (60)
    )
    Createtable TableTest
    (
                 [ReferenceId] intidentity (1,1),
                 [libelle] varchar(60)
    )
    Createtable TableTestValeurExterne
    (
                 [ReferenceId] intidentity (1,1),
                 [ReferenceId_TableTest] int,
                 [CodeSource] int,
                 [Source]varchar(12)
    )
    go
    insert into TableEntree (libelle) values ('Valeur1')
    insert into TableEntree (libelle) values ('Valeur2')
    insert into TableEntree (libelle) values ('Valeur3')
    insert into TableEntree (libelle) values ('Valeur4')
    go
    declare @MyTemporyTabletable
    (
                 [ReferenceId_TableTest] int,
                 [CodeSource] varchar(12)
    )
    INSERT INTO TableTest([libelle]) 
    OUTPUT scr.[CodeSource] , INSERTED.ReferenceId INTO @MyTemporyTable ( [ReferenceId_TableTest], [CodeSource] )
    SELECT [libelle]
    FROM TableEntree src
    
    insert into TableTestValeurExterne ( [ReferenceId_TableTest],[CodeSource],[Source] )
    select [ReferenceId_TableTest] ,[CodeSource], 'TableEntree' from @MyTemporyTable
    GO
    
    cordialement

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Ordonne tes lignes à insérer (ROW_NUMBER())

    Insère les dans cet ordre et récup les id dans une table variable qui a une clé autoinc.

    Clé autoinc = ROW_NUMBER() de la talbe source.
    Tu n'as plus qu'à faire un update de ta table variable.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 35
    Par défaut
    Bonsoir et merci pour votre intervention SergeJack

    En faite je me suis mal exprimé, le faire tel que vous me l'expliquez ne pose aucun soucis
    L'exercice consiste à le faire en une seule requête et donc en utilisant insert into ... OUTPUT ... select ... FROM

    je viens de découvrir par hasard cette notation

    Mon problème se situe sur le fait que je n'arrive pas à ajouter dans l'OUTPUT une colonne appartenant à la table emettrice et n'appartenant pas aux colonnes de la table réceptrice

    Etrangement dans le cas d'un UPDATE ou d'un DELETE il n'y a aucun problème

    Par contre je n'arrive pas à l'appliquer sur un INSERT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO TableTest([libelle]) 
    OUTPUT scr.[CodeSource] , INSERTED.ReferenceId INTO @MyTemporyTable ( [ReferenceId_TableTest], [CodeSource] )
    SELECT [libelle]
    FROM TableEntree src
    L'objectif final étant la réduction dragstiste des curseurs dans certaines procédures stockées

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Ce n'est pas possible.

    La possibilité avec DELETE et UPDATE de retrouver des colonnes d'autres tables vient de la clause FROM (propre à SQL Server).

    Cette clause n'existant pas pour INSERT, on ne peut pas récupérer des colonnes d'autres tables via OUTPUT.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 35
    Par défaut
    Bonjour,

    Merci SergeJack pour votre intervention.
    J'en suis arrivé aux mêmes conclusion que vous.

    et j'ai résolu mon problème avec un MERGE

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    MERGE TableTest t
    USING
    ( SELECT CodeSource,[libelle] FROM TableEntree )s
    ON  t.ReferenceId = -1
    WHEN NOT MATCHED BY TARGET THEN INSERT
    ([libelle])
    VALUES
    (s.[libelle])
    OUTPUT INSERTED.ReferenceId,s.CodeSource,'TableEntree'  into TableTestValeurExterne ( [ReferenceId_TableTest], [CodeSource],[Source] );

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

Discussions similaires

  1. [MySQL] Insert into n'insert pas..
    Par fizzle dans le forum PHP & Base de données
    Réponses: 19
    Dernier message: 24/07/2014, 17h44
  2. [AC-97] last insert into - dernier insert into
    Par coyote90 dans le forum VBA Access
    Réponses: 7
    Dernier message: 04/02/2011, 19h59
  3. Réponses: 5
    Dernier message: 19/10/2006, 14h28
  4. erreur SQL ...INSERT INTO
    Par naidinp dans le forum ASP
    Réponses: 20
    Dernier message: 18/09/2003, 11h38
  5. Insert Into + Date
    Par BoeufBrocoli dans le forum SQL
    Réponses: 10
    Dernier message: 13/08/2003, 11h23

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