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 multiples dans 2 tables simultanément


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Points : 34
    Points
    34
    Par défaut Insert multiples dans 2 tables simultanément
    Bonjour,

    J'ai une table A ayant pour clé un int identity et une table B.
    Dans la table A, j'importe des données d'une autre base via une instruction merge ou insert...select.
    Je voudrai stocker en même temps dans la table B, l'ID généré dans la table A ainsi qu'une donnée en provenance de l'import.
    J'ai bien vu qu'en créant une vue avec ces 2 tables et un trigger "instead of insert", je pourrai y arriver mais ça ne fonctionne pas avec un int identity semble-t-il.
    Quelqu'un aurait une idée?
    Merci

  2. #2
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    tu peux utiliser la clause OUTPUT de sql server qui permet de gérer des insertions multiples.

    ex :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO dbo.maTable( Colonne1, Colonne2, Colonne3 )
    SELECT Colonne1
         , Colonne2
         , Colonne3
    OUTPUT INSERTED.ID INTO dbo.maTable3( ID )
      FROM dbo.maTable2
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  3. #3
    Nouveau membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Points : 34
    Points
    34
    Par défaut
    Merci de ta réponse. Pour être plus précis, c'est la colonne 3 que je voudrai insérer avec mon ID dans maTable3.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO dbo.maTable( Colonne1, Colonne2)
    SELECT Colonne1
         , Colonne2
         , Colonne3
    OUTPUT INSERTED.ID INTO dbo.maTable3( ID, Colonne3 )
      FROM dbo.maTable2
    [/QUOTE]

    Est-ce que ça peut fonctionner?

  4. #4
    Membre averti
    Homme Profil pro
    R&D
    Inscrit en
    Avril 2004
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : R&D

    Informations forums :
    Inscription : Avril 2004
    Messages : 127
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par Clarkgbl Voir le message
    Bonjour,

    J'ai une table A ayant pour clé un int identity et une table B.
    Dans la table A, j'importe des données d'une autre base via une instruction merge ou insert...select.
    Je voudrai stocker en même temps dans la table B, l'ID généré dans la table A ainsi qu'une donnée en provenance de l'import.
    J'ai bien vu qu'en créant une vue avec ces 2 tables et un trigger "instead of insert", je pourrai y arriver mais ça ne fonctionne pas avec un int identity semble-t-il.
    Quelqu'un aurait une idée?
    Merci
    Outre la clause OUTPUT pertinente pour les cas éventuels, le trigger simple de 3 lignes sera le mécanisme permanent
    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
    CREATE TABLE dbo.t1 (col1 int IDENTITY(1,1), col2 int, col3 int)
    GO
    CREATE TABLE dbo.t2 (col1 int, col3 int)
    GO
    CREATE TRIGGER dbo.t1_insert ON dbo.t1 FOR INSERT
    AS
    BEGIN
      SET NOCOUNT ON;
      INSERT INTO dbo.t2 (col1, col3)
      SELECT col1, col3 FROM inserted;
    END
    GO
    -- Test 
    INSERT INTO dbo.t1 (col2, col3)
    SELECT 21, 31
    UNION ALL
    SELECT 22, 32
    UNION ALL
    SELECT 23, 33
     
    SELECT * FROM dbo.t2

  5. #5
    Expert éminent
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Points : 6 775
    Points
    6 775
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Clarkgbl Voir le message
    Merci de ta réponse. Pour être plus précis, c'est la colonne 3 que je voudrai insérer avec mon ID dans maTable3.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    INSERT INTO dbo.maTable( Colonne1, Colonne2)
    SELECT Colonne1
         , Colonne2
         , Colonne3
    OUTPUT INSERTED.ID INTO dbo.maTable3( ID, Colonne3 )
      FROM dbo.maTable2

    Est-ce que ça peut fonctionner?
    biensur que tu peux, il suffit de la rajouter dans la clause OUTPUT

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO dbo.maTable( Colonne1, Colonne2)
    SELECT Colonne1
         , Colonne2
    OUTPUT INSERTED.ID, maTable2.Colonne3 INTO dbo.maTable3( ID, Colonne3 )
      FROM dbo.maTable2

    si je ne me trompe pas, ça devrait fonctionner.

    Le trigger est tout a fait utilisable, mais je suis pas un grand adèpte de l'utilisation du trigger ^^

    Cordialement,
    Lyche
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

  6. #6
    Nouveau membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Points : 34
    Points
    34
    Par défaut
    Bonjour et merci pour ces réponses.

    Pour ta réponse, Serguei_TARASSOV, ça implique de stocker la donnée col3 dans les 2 tables, ce que je ne veux pas justement.
    Je suis parvenu à mes fins avec un merge into couplé à une CTE. Le seul hic, c'est que ça ne fonctionne pas s'il y a des règles sur la table.
    Merci

  7. #7
    Nouveau membre du Club
    Profil pro
    Développeur .NET
    Inscrit en
    Mars 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2009
    Messages : 30
    Points : 34
    Points
    34
    Par défaut
    Bon en fait, le merge pose problème avec une contrainte sur la table...
    Pour ta réponse, Lyche, j'ai une erreur sur la syntaxe que tu donnes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     INSERT INTO dbo.maTable( Colonne1, Colonne2)
    SELECT Colonne1
         , Colonne2
    OUTPUT INSERTED.ID, maTable2.Colonne3 INTO dbo.maTable3( ID, Colonne3 )
      FROM dbo.maTable2
    En revanche si je l'écris comme ça, ça passe pour la syntaxe, mais les colonnes en provenance de maTable2 sont refusées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     INSERT INTO dbo.maTable( Colonne1, Colonne2)
    OUTPUT INSERTED.ID, maTable2.Colonne3 INTO dbo.maTable3( ID, Colonne3 )
    SELECT Colonne1
         , Colonne2
      FROM dbo.maTable2
    Merci

Discussions similaires

  1. Insertion multiple dans une table et limitation du nombre de lignes
    Par marcandre dans le forum Développement
    Réponses: 1
    Dernier message: 29/04/2011, 15h10
  2. Insert multiple dans une table
    Par hgibier dans le forum SQL
    Réponses: 11
    Dernier message: 26/11/2010, 10h37
  3. insertion multiple dans des tables reliés avec transaction
    Par tortuegenie dans le forum ASP.NET
    Réponses: 8
    Dernier message: 28/01/2009, 21h10
  4. Insertion Multiple dans une Table
    Par faressam dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/09/2008, 14h10
  5. insertion multiple dans une table
    Par nenekes dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/02/2007, 10h50

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