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

MS SQL Server Discussion :

Erreur lors d'une requete insert into.. select


Sujet :

MS SQL Server

  1. #1
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut Erreur lors d'une requete insert into.. select
    Bonjour à tous,

    J'effectue une requete qui transvase des données d'une table dans une autre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO t1 (c1, c2, c3) 
    SELECT c1, c2, c3 FROM t2
    Jusque là tout va bien.
    Soit les valeurs suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    T1
    c1         c2            c3
    --------  -----------  ----------
    a           b              c
    d           e              f             <---
    a           e              f
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    T2
    c1         c2            c3
    --------  -----------  ----------
    x           y              z
    t           u              v
    d           e              f             <---
    On remarque que ('d', 'e', 'f') est dans chaque table.
    Or la clef est (c1, c2, c3), donc SQLServeur me jette car il peut pas inserer de clef en double.

    Jusque là ca va encore.
    Ma question est la suivante :
    Est ce que SQLServeur s'arrète à la première erreur rencontrée ou est-ce qu'il continue l'insertion ? (il me dit que la commande a été arrêtée )

    Question subsidiare :
    Comment modifié ma requète pour que je puisse insérer seulement les n-uplets de t2 qui ne sont pas dans t1 ?

    Merci de votre aide,

    N

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 12
    Points : 14
    Points
    14
    Par défaut
    Il me semble qu'un truc comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO T1&#40;c1, c2, c3&#41; 
    SELECT c1, c2, c3 FROM t2 
    WHERE c1 NOT IN &#40;SELECT c1 FROM t1&#41; 
    AND c2 NOT IN &#40;SELECT c2 from T1&#41; 
    AND c3 NOT IN &#40;SELECT c3 from T1&#41;
    A tester et confirmer, sachant que cela prend certaines ressources...
    Don't try it, catch it !
    It's the only way to make it work !

  3. #3
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Pour la première question, le serveur fait un rollback de la transaction complète si une ligne vient à poser problème
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  4. #4
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par quickaboy
    Il me semble qu'un truc comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO T1&#40;c1, c2, c3&#41; 
    SELECT c1, c2, c3 FROM t2 
    WHERE c1 NOT IN &#40;SELECT c1 FROM t1&#41; 
    AND c2 NOT IN &#40;SELECT c2 from T1&#41; 
    AND c3 NOT IN &#40;SELECT c3 from T1&#41;
    A tester et confirmer, sachant que cela prend certaines ressources...
    Je suis pas d'accord avec cette solution.
    si dans T1(c1, c2, c3) j'ai ('a', 'b', 'c') et que je veux insérer le n-uplet de T2 ('x', 'b', 'c') alors la requete passe pas car T2.c2 in T1.c2 (désolé pour la syntaxe ) J'ai bon ?


    Citation Envoyé par fadace
    Pour la première question, le serveur fait un rollback de la transaction complète si une ligne vient à poser problème
    Merci, c'est pas ce que je pensais...

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 756
    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 : 21 756
    Points : 52 531
    Points
    52 531
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO T1&#40;c1, c2, c3&#41;
    SELECT c1, c2, c3 
    FROM   t2
    WHERE  NOT EXISTS &#40;SELECT * 
                       FROM   T2
                       WHERE  T1.C1 = T2.C1
                         AND  T1.C2 = T2.C2
                         AND  T1.C3 = T2.C3&#41;
    Sera plus performant !

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

  6. #6
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Merci !

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

Discussions similaires

  1. Comment savoir si une requete INSERT INTO a bien marché ?
    Par Whattt dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 29/06/2006, 08h06
  2. Réponses: 5
    Dernier message: 23/06/2006, 15h04
  3. Réponses: 3
    Dernier message: 05/01/2006, 15h14
  4. petite aide sur une requete INSERT INTO
    Par bonneti dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2005, 15h17
  5. Erreur lors d'une requete INNER JOIN
    Par k-lendos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/03/2004, 15h09

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