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 d'importation de données


Sujet :

Développement SQL Server

  1. #1
    Membre expérimenté
    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 : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut problème d'importation de données
    Bonjour,

    Je récupère des données d'un serveur oracle lié et je dois les injecter dans les tables appropriées d'une DB sql server.

    Je voudrais éviter d'utiliser un curseur et travailler de manière ensembliste mais je n'arrive pas à visualiser les opérations nécessaires.

    Les données en question sont des transactions caisses impliquant des gift-cards ou gift-cheques.

    J'en suis au "schéma" suivant :
    1 : récupérer les données depuis le serveur lié
    2 : récupérer(créer s'il n'existe pas) l'id du/des gifts
    3 : insérer dans la table transaction

    C'est le point 2 qui me pose problème à priori.
    En gros, j'ai une table pour les cartes et une table pour les cheques qui héritent toutes deux leur clef primaire de la table gift (héritage exclusif).

    Il est facile de savoir quels gifts existent déjà ou non dans la DB.

    Mon gros problème est d'arriver à insérer de manière ensembliste ceux qui n'existe pas encore. Si l'insertion portait sur une seule table, pas de souci. Mais vu qu'il y a héritage, je dois d'abord insérer dans la table parente pour avoir la clef primaire. Du coup, je bloque...
    C'est tellement flou que j'ai même du mal à mettre par écrit ce que je n'arrive pas à faire à ce niveau là.

    Disons que j'ai 20 cartes qui n'existent pas encore. Je dois donc insérer 20 lignes dans la table parente (gift), récupérer les identifiants qui viennent d'être insérer et les utiliser pour insérer dans la table fille (carte). C'est cela que je ne vois pas comment faire...

    [EDIT]
    Pour le moment, pour insérer une carte, je fais ceci (via une procédure stockée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DECLARE @GFT_ID INT;
    INSERT INTO DBO.T_GIFT_GFT DEFAULT VALUES;
    SET @GFT_ID = SCOPE_IDENTITY();
    INSERT INTO DBO.T_CARD_CRD(GFT_ID,...)
    VALUES(@GFT_ID,...)
    Déjà rien que l'insertion dans la table T_GIFT_GFT, je ne vois pas comment y insérer plusieurs ligne sans boucle :-/
    [/EDIT]

    Une fois que les gifts sont créés et que j'ai l'id de chacun, insérer les transactions dans la table du même nom ne pose aucun problème.

  2. #2
    Membre expérimenté
    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 : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Re-bonjour,

    Alors, je ne comprends pas encore tout à fait comment ça fonctionne mais j'ai trouvé ici un bout de code qui me permet d'insérer dans la table parente et d'associer un les id's insérés avec les lignes que je récupère du serveur lié.

    J'ai créé une table T_TEST_TST avec juste une colonne identity pour tester et ça a l'air de bien fonctionner. Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    MERGE INTO T_TEST_TST
    USING (SELECT --les colonnes qui vont bien
           FROM   --le serveur lié
           WHERE --les filtres qui vont bien
           ) T
    ON 1 = 0
    WHEN NOT MATCHED THEN
      INSERT
      DEFAULT VALUES
    OUTPUT INSERTED.TST_ID,T.*;

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    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 : 22 001
    Billets dans le blog
    6
    Par défaut
    Le merge est une solution.. mais comme vous devez insérer dans deux tables il faut utiliser un trigger INSTEAD OFF.
    En gros vous voulez insérer dans GIFT, mais il faut préalablement insérer dans la table mère. Avec un trigger INSTEAD OF vous allez récupérer dans la tables inserted, les nouvelles clef et commencer par insérer dans la table mère avant la table de destination.

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

  4. #4
    Membre expérimenté
    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 : 42
    Localisation : Belgique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Je ne suis pas certain de bien vous comprendre.

    Ce que je comprends :
    1 : créer un trigger instead of insert sur la table fille qui fera l'insert dans la table mère et ensuite dans la table fille
    2 : faire l'insertion dans la fille

    Je me suis p-e mal exprimer mais le bout de code que j'ai montré sera utilisé pour insérer dans la table mère et récupérer les id pour insérer dans la table fille. Après ce soit dans un trigger, une procédure ou autre, peu importe non ?

    Sinon, vu que j'ai dévouvert cette clause OUTPUT, je me suis tourné plus amplement vers elle pour voir ce qu'il est possible de faire avec sans utiliser MERGE car je ne connais pas cette instruction.

    Ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE @TST_ID TABLE(TST_ID INT);
     
    INSERT INTO dbo.T_TEST_TST OUTPUT INSERTED.TST_ID INTO @TST_ID DEFAULT VALUES 
     
    SELECT * FROM @TST_ID;
    Je cherche maintenant à faire la même chose pour insérer plusieurs lignes.
    J'en suis là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE @INSERTED TABLE(TST_ID INT, STR_ID TINYINT, TRN_DATE DATETIME, TRN_TILL INT, TRN_TICKET INT, BARCODE VARCHAR(40), TRN_VALUE DECIMAL(8,2), TTR_ID INT);
    INSERT INTO T_TEST_TST(TST_ID) OUTPUT INSERTED.TST_ID, T.* INTO @INSERTED
    SELECT 
            NULL
    FROM    
            BRU32SRV129SQL2.TEST.DBO.TEST_GIFT_USAGE TGU
                LEFT JOIN    DBO.V_GIFT_VGF VGF
                    ON    TGU.BARCODE = VGF.VGF_BARCODE
    WHERE    GFT_ID IS NULL
    SELECT * FROM @INSERTED
    N.B. : V_GIFT_VGF est une vue des gifts existant avec leur id et leur barcode.

    Je ne trouve pas ce qu'il faut mettre à la place de NULL dans la clause SELECT... J'ai essayé plusieurs choses mais je reçois chaque fois une erreur car j'essaie d'insérer une valeur dans une colonne identity...

    Suis-je sur la bonne voie ou totalement à coté de mes pompes ?

    (vivement le mois d'août, on m'a promis une formation avancée en sql...)

    EDIT : Pour le moment, je me dirige vers le merge puisque ça fonctionne et me donne quelque chose que je suis capable d'exploiter en attendant d'avoir un éclaircissement sur le trigger instead of.

  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
    22 001
    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 : 22 001
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Je ne suis pas certain de bien vous comprendre.

    Ce que je comprends :
    1 : créer un trigger instead of insert sur la table fille qui fera l'insert dans la table mère et ensuite dans la table fille
    OUI !
    2 : faire l'insertion dans la fille
    NON... car déjà fait dans le trigger. Au final vous n'avez plus qu'a faire une seule insertion dans la table fille.
    ...
    Sinon, vu que j'ai dévouvert cette clause OUTPUT, je me suis tourné plus amplement vers elle pour voir ce qu'il est possible de faire avec sans utiliser MERGE car je ne connais pas cette instruction.
    OUI vous pouvez utiliser la clause OUTPUT pour reprendre les ID, mais pas dans un trigger ! Le mieux étant de précalculer vos ID en utilisant les fonction associées aux auto incrément (DBCC CHECKIDENT et cie)

    Ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE @TST_ID TABLE(TST_ID INT);
     
    INSERT INTO dbo.T_TEST_TST OUTPUT INSERTED.TST_ID INTO @TST_ID DEFAULT VALUES 
     
    SELECT * FROM @TST_ID;
    Je cherche maintenant à faire la même chose pour insérer plusieurs lignes.
    J'en suis là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE @INSERTED TABLE(TST_ID INT, STR_ID TINYINT, TRN_DATE DATETIME, TRN_TILL INT, TRN_TICKET INT, BARCODE VARCHAR(40), TRN_VALUE DECIMAL(8,2), TTR_ID INT);
    INSERT INTO T_TEST_TST(TST_ID) OUTPUT INSERTED.TST_ID, T.* INTO @INSERTED
    SELECT 
            NULL
    FROM    
            BRU32SRV129SQL2.TEST.DBO.TEST_GIFT_USAGE TGU
                LEFT JOIN    DBO.V_GIFT_VGF VGF
                    ON    TGU.BARCODE = VGF.VGF_BARCODE
    WHERE    GFT_ID IS NULL
    SELECT * FROM @INSERTED
    N.B. : V_GIFT_VGF est une vue des gifts existant avec leur id et leur barcode.

    Je ne trouve pas ce qu'il faut mettre à la place de NULL dans la clause SELECT... J'ai essayé plusieurs choses mais je reçois chaque fois une erreur car j'essaie d'insérer une valeur dans une colonne identity...

    Suis-je sur la bonne voie ou totalement à coté de mes pompes ?

    (vivement le mois d'août, on m'a promis une formation avancée en sql...)

    EDIT : Pour le moment, je me dirige vers le merge puisque ça fonctionne et me donne quelque chose que je suis capable d'exploiter en attendant d'avoir un éclaircissement sur le trigger instead of.
    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/ * * * * *

Discussions similaires

  1. Problème d'import de données
    Par max12 dans le forum Services Web
    Réponses: 1
    Dernier message: 21/06/2007, 20h27
  2. Réponses: 4
    Dernier message: 11/12/2006, 11h21
  3. Problème d'importation de données
    Par Team2i dans le forum Access
    Réponses: 2
    Dernier message: 16/08/2006, 09h13
  4. [VBA-A] problème d'import de données texte
    Par David M dans le forum VBA Access
    Réponses: 2
    Dernier message: 08/05/2006, 15h45
  5. Problème à l'importation des données
    Par steinfield dans le forum Access
    Réponses: 2
    Dernier message: 24/04/2006, 16h02

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