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

Administration SQL Server Discussion :

Copier les bases portant le même nom sur une même base


Sujet :

Administration SQL Server

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Copier les bases portant le même nom sur une même base
    Bonjour à tous.

    Je dispose d'un serveur SQL avec différentes bases.
    Sur ces bases, certaines disposent des mêmes tables.

    Je souhaiterai trouver le moyen de copier la table nommé Table1, par exemple, (présente sur plusieurs BDD) sur une autre table.
    Le but est de regrouper toutes les données contenues dans différentes tables (portant le même nom) sur différentes BDD.

    L'idéal est de copier les tables en ajoutant une colonne qui reprendrait le nom de la BDD d'origine.

    J'espère m'exprimer correctement.

    Un grand merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Si les bases sont sur la même instance, il suffit de préfixer le nom des tables avec celui de la base.
    Sinon il faut aussi ajouter le nom de l'instance.
    Il faut également vérifier que l'utilisateur possède les droits suffisants pour accéder aux diverses instances/bases.

    Enfin pour insérer les données, une requête de type insert into ... select fera l'affaire.

    Tatayo.

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Une table peut rarement être copiée isolément, avec les contraintes d'intégrité, il faut le plus souvent recopier une grappe de tables.

    De plus, si le but est de converger plusieurs tables en une seule, il faut prévoir une étape de dédoublonnage fonctionnel dans laquelle on décide en cas de doublon quelles valeurs conserver (la valeur de T1, de T2... de Tn, une combinaison de contenus de telles et telles colonnes...).

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour à tous
    Merci pour vos retours !

    Pour apporter une précision, les BDD correspondent à des sociétés.
    Dans chaque DBB, les mêmes tables sont présentes et correspondent à la comptabilité de chaque société.

    L'idée est donc de réaliser une table qui regroupe toutes les lignes de toutes les sociétés en une seule.
    Il me faut donc au moment d'ajouter les lignes d'une BDD dans la table "maitre" une colonne qui identifiera de quelle société les lignes proviennent.

    je continue d'avancer de mon côté

    bien à vous

  5. #5
    Membre éprouvé Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    Septembre 2021
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : Septembre 2021
    Messages : 449
    Points : 1 294
    Points
    1 294
    Par défaut
    Ça serait bien plus propre et intègre d'avoir une vue qui regroupe toutes les informations, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create view dbo.Recap as 
    select 'Cli1' as Client, * from [bd_Cli1].dbo.LaTable
    union all select 'Cli2' as Client, * from [bd_Cli2].dbo.LaTable
    union all select 'Cli3' as Client, * from [bd_Cli3].dbo.LaTable

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par slouchart Voir le message
    ...Dans chaque DBB, les mêmes tables sont présentes et correspondent à la comptabilité de chaque société.

    L'idée est donc de réaliser une table qui regroupe toutes les lignes de toutes les sociétés en une seule....
    Il suffit de fédérer vos tables à travers les différentes bases à l'aide de vues :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE VIEW V_MaTable
    AS
    SELECT * FROM MaBase1.MonSchema.MaTable
    UNION ALL
    SELECT * FROM MaBase2.MonSchema.MaTable
    UNION ALL
    ...
    UNIO ALL
    SELECT * FROM MaBaseN.MonSchema.MaTable;
    N'oubliez opas que SQL Server est multibase, multishéma et optimisé pour des opérations inter-bases contrairement à Oracle ou PostGreSQL qui doivent passer par des DBlink et faire des "remote"... c'est à dire copier les lignes des tables d'une base dans l'autre avant d'effectuer la requête...

    Si toutes vos tables sont identiques dans toutes vos bases, la création de vos vues peut se faire en un seul script assez simple. Exemple :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    SELECT ROW_NUMBER() OVER(ORDER BY name) AS IDN, name
    INTO   #T_DATABASES
    FROM   sys.databases
    WHERE  name NOT IN ('master', 'model', 'msdb', 'tempdb', 'distribution', 'semanticdb')
      AND  name NOT LIKE 'ReportServer%';
     
    CREATE TABLE #T_TABLES (TABLE_SCHEMA sysname, TABLE_NAME sysname);
     
    DECLARE @SQL NVARCHAR(max) 
       = N'SELECT TABLE_SCHEMA, TABLE_NAME FROM [' 
       + (SELECT name FROM #T_DATABASES WHERE IDN = 1) +
       + '].INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE TABLE''';
    INSERT INTO #T_TABLES
    EXEC (@SQL);
    GO
     
    CREATE DATABASE _DB_FEDERATION;
    GO
     
    USE _DB_FEDERATION
    GO
     
    DECLARE @TABLE_SCHEMA sysname, @TABLE_NAME sysname, @SQL NVARCHAR(max);
    DECLARE C CURSOR 
    FOR SELECT TABLE_SCHEMA, TABLE_NAME
        FROM   #T_TABLES;
    OPEN C;
    FETCH C INTO @TABLE_SCHEMA, @TABLE_NAME;
    WHILE @@FETCH_STATUS = 0
    BEGIN
       SET @SQL = N'';
       SELECT @SQL = @SQL + N'SELECT * FROM [' + name + N'].[' + @TABLE_SCHEMA + N'].[' + @TABLE_NAME + N'] UNION ALL '
       FROM   #T_DATABASES;
       SET @SQL = N'CREATE VIEW [' + @TABLE_SCHEMA + '].[V_' + @TABLE_NAME + '] AS ' 
                + LEFT(@SQL  , LEN(@SQL) - 10);
       PRINT @SQL
       EXEC (@SQL);
       FETCH C INTO @TABLE_SCHEMA, @TABLE_NAME;
    END;
     
    CLOSE C;
     
    DEALLOCATE C;
     
    DROP TABLE #T_DATABASES;
    DROP TABLE #T_TABLES;
    Ceci va créer une base de nom _DB_FEDERATION contenant les vues rassemblant toutes les tables.

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

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Mars 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Auditeur informatique
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    C'est parfait ! Merci beaucoup !
    C'est exactement ce dont j'ai besoin.

    Est il possible de lister sur un serveur la liste des BDD et de créer la requête que vous m'avez donnée en 'automatique' ?

    bonne soirée

  8. #8
    Membre éprouvé Avatar de AaâÂäÄàAaâÂäÄàAaâÂäÄ
    Homme Profil pro
    db@
    Inscrit en
    Septembre 2021
    Messages
    449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : db@

    Informations forums :
    Inscription : Septembre 2021
    Messages : 449
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par slouchart Voir le message
    Est il possible de lister sur un serveur la liste des BDD et de créer la requête que vous m'avez donnée en 'automatique' ?
    Vu les heures des messages, tu as du raté la réponse de SQLpro ci-dessus qui détaille davantage et donne le code pour la génération de la vue

Discussions similaires

  1. [Toutes versions] Copier les donnees d'un Userform multipage sur une feille excel
    Par mercikevin dans le forum Excel
    Réponses: 0
    Dernier message: 13/02/2018, 12h07
  2. Réponses: 9
    Dernier message: 26/05/2016, 18h25
  3. Réponses: 2
    Dernier message: 19/07/2015, 18h34
  4. Réponses: 6
    Dernier message: 20/08/2011, 09h55
  5. Réponses: 3
    Dernier message: 23/01/2008, 03h52

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