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 :

Ajouter plusieurs lignes en une requête si existe pas


Sujet :

Développement SQL Server

  1. #1
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut Ajouter plusieurs lignes en une requête si existe pas
    Bonjour,

    sur sql server 2008
    J'utilise cette requête pour ajouter plusieurs lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO [SAD].[dbo].[BMBOM]
               ([A],[B],[C],[D],[E])
    VALUES
    ('aa','bb','cc','dd','ee'),
    ('aa','ff','cc','gg','ee'),
    (.....)
    mais elle bloque si une ligne existe
    J'aimerais savoir si on peut ajouter plusieurs lignes en une requête si elle n'existe pas.

    clé primaire sur les 4 premières colonnes soit sur A, B, C et D.

    il y a bien cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    IF not EXISTS (SELECT * FROM [SAD].[dbo].[BMBOM] WHERE [A] = 'aa' and [B]='ff' and [C]='cc' and [C]='gg')
    INSERT INTO [SAD].[dbo].[BMBOM]([A],[B],[C],[D],[E])
    VALUES ('aa','ff','cc','gg',ee)
     
    Go
     
    IF not EXISTS (SELECT * FROM [SAD].[dbo].[BMBOM] WHERE [A] = 'aa' and [B]='bb' and [C]='cc' and [C]='dd')
    INSERT INTO [SAD].[dbo].[BMBOM]([A],[B],[C],[D],[E])
    VALUES ('aa','bb','cc','dd',ee)
     
    Go
    (...)


    mais beaucoup trop long.


    Merci!

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2014
    Messages : 219
    Points : 336
    Points
    336
    Par défaut
    Bonjour, d'après mes humbles connaissances tu es obligé de passer par un IF NOT EXIST INSERT INTO, ou de mettre un SELECT dans ton INSERT.

    Cordialement.
    Si débugger est l'art de corriger les bugs, alors programmer est l'art d'en créer.

  3. #3
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Tu peux faire un Insert en une et une seule instruction SQL, en procédant comme suit :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ;WITH Source AS (        SELECT 'aa' AS [A],'bb' AS [B],'cc' AS [C] ,'dd' AS [D] ,'ee' AS [E] 
                       UNION SELECT 'aa','ff','cc','gg','ee'
    	        -- UNION SELECT .....     )   -- à compléter pour les lignes à insérer ..
    INSERT INTO [SAD].[dbo].[BMBOM]
      (A, B, C, D, E) 
    SELECT [A], [B], [C], [D], [E]  
    FROM Source 
    WHERE NOT EXISTS (SELECT 1
                      FROM   [SAD].[dbo].[BMBOM]  T 
    		  WHERE  T.[A] = Source.[A] 
    		  AND    T.[B] = Source.[B] 
    		  AND    T.[C] = Source.[C] 
    		  AND    T.[D] = Source.[D]);

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  4. #4
    Membre éprouvé
    Homme Profil pro
    Programmeur analyste
    Inscrit en
    Février 2009
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Canada

    Informations professionnelles :
    Activité : Programmeur analyste
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2009
    Messages : 546
    Points : 1 116
    Points
    1 116
    Par défaut Résolu
    Merci hmira!

    ça fonctionne.
    en plein ce que j'avais besoin.

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 698
    Points : 586
    Points
    586
    Par défaut
    Dans un cas similaire, j'ai utilisé la fonction Merge dans un trigger Instead of insert, ça marche plutôt bien.

  6. #6
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut UNION vs UNION ALL et doublons dans la source de données !
    Encore une petite précision :

    Si vous êtes sûr et certain que votre source de données ne contient pas de doublon dans les 4 premières colonnes (A, B, C, D), vous pouvez encore optimiser la requête en remplaçant, dans la CTE, l'opérateur UNION par UNION ALL (UNION ALL étant moins coûteux que UNION). En revanche, si vous n'êtes pas sûr de l'unicité des 4 première colonnes de la source (c.à.d, s'il peut y avoir potentiellement des doublons dans les 4 premières colonnes de la source) alors garder la requête, telle qu'elle est, inchangée.

    En effet en cas de doublon sur les 4 premières colonnes (A, B, C, D) dans la source de données, et en cas d'utilisation UNION ALL en lieu et place de UNION dans la CTE, la clause WHERE NOT EXISTS (... ) ne vous protégera pas du "crash" inéluctable et imminent dû la violation de la clé primaire de la table BMBOM lors de l'insertion ! La raison découle simplement du fait que le SQL est par essence un langage ensembliste, et que l'insertion ne se fait pas ligne par ligne depuis la source.

    Pour illustrer mes propos, vous pouvez essayer ceci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    ;WITH Source AS (        SELECT 'aa' AS [A],'bb' AS [B],'cc' AS [C] ,'dd' AS [D] ,'ee' AS [E] 
                       UNION ALL SELECT 'aa','ff','cc','gg','ee'				   
    		   UNION ALL SELECT 'aa','ff','cc','gg','tt'    -- doublon sur les 4 premières colonnes et UNION ALL  --> crash imminent ! La clause NOT EXISTs ci-dessous n'y changera rien ! 
                      -- UNION ALL ....    ) 
    INSERT INTO [SAD].[dbo].[BMBOM]
      (A, B, C, D, E) 
    SELECT [A], [B], [C], [D], [E]  
    FROM Source 
    WHERE NOT EXISTS (SELECT 1
                      FROM   [SAD].[dbo].[BMBOM]  T 
    		  WHERE  T.[A] = Source.[A] 
    		  AND    T.[B] = Source.[B] 
    		  AND    T.[C] = Source.[C] 
    		  AND    T.[D] = Source.[D]);

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

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

Discussions similaires

  1. [SP-2010] Ajouter plusieurs lignes dans une liste via un WorkFlow.
    Par Jonathan.F dans le forum SharePoint
    Réponses: 2
    Dernier message: 19/03/2014, 11h31
  2. ajouter plusieurs lignes pour une personne
    Par frommage dans le forum VBA Access
    Réponses: 8
    Dernier message: 21/11/2012, 04h18
  3. [AC-2007] Concaténation de plusieurs lignes d'une requête
    Par Thiaume dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 01/06/2012, 09h06
  4. [Toutes versions] Ajouter plusieurs lignes dans une table automatiquement
    Par bbolt dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 24/01/2010, 15h08
  5. [MySQL] Sélection de plusieurs lignes en une requête
    Par kalash_jako dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/05/2006, 19h43

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