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 :

[SQL2005] Regrouper les données de plusieurs bases dans une seule


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut [SQL2005] Regrouper les données de plusieurs bases dans une seule
    Bonjour,

    J'ai d'un coté, plusieurs systèmes enregistrant des données. Chaque système enregistre ses données dans sa propre base de données. Le SGBD est SQL SERVER 2005.
    Je cherche à regrouper les données de tous les systèmes dans une base de données centrale de même structure que les bases systèmes afin d'en exploiter les données.

    Certaines tables contiennent des clefs primaires / étrangères et des contraintes d'unicité.
    Les tables sont amenées à contenir quelques centaines de milliers d'enregistrements.

    Quelle méthode me conseilleriez-vous pour effectuer ceci proprement?

    Merci d'avance.

    Oliviera63


  2. #2
    Membre émérite

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Points : 2 856
    Points
    2 856
    Par défaut
    Depuis le serveur central, tu peux créer des liens vers les autres BD (BD1,BD2,...)
    puis simuler MERGE sous SQL SERVER 2005
    Vous devez d'abord identifier ce qui permet de mettre à jour une ligne (présence par exemple de colonne date de création, date de modification,....)

    Concrètement si un même identifiant est présent dans la Table1 (BD1) et Table 1 (BD2) sur quelle(s) colonne(s) de Table1 doit-on se baser pour mettre à jour (UPDATE) cette ligne dans Table1 (BDD centrale) ?
    Etienne ZINZINDOHOUE
    Billets-Articles

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 89
    Points
    89
    Par défaut
    Je te suggère de créer une base avec la même structure, mais en y appliquant les retouches suivantes :
    - Ajoutes une colonne IDbase à chaque table de la base globale
    - Ajoute cette colonne IDbase à tous les contraintes d'unicité, indexes uniques et clé primaires de la base globale
    - Retire l'attribut Identity aux colonnes qui en sont dotés
    - Supprime toutes les contraintes foreign key (les relations)
    - Eventuellement, supprime les indexes que tu n'utilisera pas pour interroger ta base globale, cela accélérera l'import.
    - Puis importe successivement toutes les tables de chaque base, en rajoutant l'identifiant de la base source dans la colonne IDbase.
    Si le volume n'est pas trop important il est plus simple de vider puis réimporter tout à chaque fois,
    sinon un MERGE est envisageable, mais il faut y énumérer toutes les colonnes susceptibles d'avoir été mises à jour dans la clause WHEN MATCHED,
    ce qui peut être assez fastidieux, et même se révéler plus lent que le réimport complet !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Bonsoir, et un grand merci pour vos réponses.

    Sur le serveur, j'ai une base de structure identique à celle des systèmes, sans clefs, contraintes d'unicite etc...

    A chaque fois que le serveur interroge un des systèmes, c'est uniquement pour récupérer les nouveaux enregistrements car il n'y a jamais de modifications des données (Juste des INSERT sur les tables qui m’intéressent...).

    Je ne souhaite ajouter que les enregistrements qui ne sont pas encore présent dans la base de données (dans la table plutôt...)
    Actuellement, je remplis chaque table de cette façon:
    INSERT INTO MaBase.Matable SELECT (col1, Col2, col3, ...) FROM [AdressIP].[BasedeDonnées].MaTable WHERE Col1 NOT IN (SELECT Col1 FROM MaBase.MaTable)

    Cette façon de procéder est-elle correcte lorsque la base du serveur contient un très grand nombre de données? ou existe-il un moyen plus simple?

    Merci encore.

    Oliviera63

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par oliviera63 Voir le message
    ... WHERE Col1 NOT IN (SELECT Col1 FROM MaBase.MaTable)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... WHERE NOT EXISTS (SELECT * from MaBase.MaTable WHERE MaBase.MaTable.Col1 =  [AdressIP].[BasedeDonnées].MaTable.Col1
    me semble plus approprié, le NOT IN est réputé lent

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Re-bonsoir,

    Je vais remplacer le NOT IN par NOT EXISTS...

    Puis-je conclure que ma façon de procéder est appropriée?

    Merci pour ton aide.

    Oliviera63

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par oliviera63 Voir le message
    Sur le serveur, j'ai une base de structure identique à celle des systèmes, sans clefs, contraintes d'unicite etc...
    Il faudrait quand même une clef primaire, sans quoi impossible de différencier les nouvelles lignes des anciennes !

    De plus, si cette clé primaire est un Identity, ou simplement qu'elle risque de se trouver la même dans plusieurs bases,
    il est indispensable de rajouter à chaque table la colonne IDbase (avec l'identifiant de ton choix, par exemple AdressIP) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO MaBase.Matable  (AdressIP,col1, Col2, col3, ...)
    SELECT (AdressIP,col1, Col2, col3, ...) 
    FROM  [AdressIP].[BasedeDonnées].MaTable 
    WHERE NOT EXISTS (
        SELECT * FROM MaBase.MaTable 
        WHERE MaBase.MaTable.Col1 =  [AdressIP].[BasedeDonnées].MaTable.Col1
        and MaBase.MaTable.IDbase = AdressIP
    )
    Et tu devra rajouter cette colonnes dans les requetes sur la base globale dans les jointures clé primaire / clé étrangère

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Un grand merci pour ta précieuse aide.

    Oliviera63

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

Discussions similaires

  1. Regrouper les données de plusieurs feuilles dans une
    Par djinero dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/10/2011, 23h47
  2. récuperer les données de ma base dans une listeView
    Par bounasri dans le forum Android
    Réponses: 3
    Dernier message: 06/05/2011, 18h35
  3. Copier les données de plusieurs colonnes dans une nouvelle feuille
    Par lolonico1974 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/07/2010, 07h51
  4. Réponses: 3
    Dernier message: 19/04/2008, 17h32
  5. Intégrer les données de plusieurs fichiers dans une table
    Par soad029 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/11/2007, 03h57

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