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 :

comparer deux tables


Sujet :

MS SQL Server

  1. #1
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut comparer deux tables
    salut
    je veux comparer la structure de deux table pour savoir s'il ont la même structure ou pas
    j'ai essayé ceci mais ça ne me donne que les colonnes communes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select s1.name, s1.type, s2.name, s2.type from syscolumns s1, syscolumns s2  where s1.id = object_id(T1) and s2.id = object_id(T2)
    and s1.name=s2.name
    merci

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    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 997
    Billets dans le blog
    6
    Par défaut
    Si la comparaison ne porte que sur les colonnes :

    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
    SELECT *, 'Table1' AS Source
    FROM  INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'dbo'
       AND TABLE_NAME = 'Matable1'
    EXCEPT
    SELECT *, 'Table1' AS Source
    FROM  INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'dbo'
       AND TABLE_NAME = 'Matable2'
    UNION ALL
    SELECT *, 'Table2' AS Source
    FROM  INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'dbo'
       AND TABLE_NAME = 'Matable2'
    EXCEPT
    SELECT *, 'Table2' AS Source
    FROM  INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'dbo'
       AND TABLE_NAME = 'Matable1'
    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/ * * * * *

  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 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 227
    Billets dans le blog
    25
    Par défaut
    Autre possibilité plus "bourrin", mais qui teste aussi les types

    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
    ALTER proc [dbo].[sp_compareTbl] 
    (@Tbl1 sysname,
    @Tbl2 sysname)
    as
    begin
     
    create table #comp(Analyse varchar(20),
                    Tbl sysname,
                    col sysname)
     
    /* lignes identiques */
    insert into #comp 
    select 'Colonnes identiques', '*', s1.name
     from syscolumns s1 inner join syscolumns s2
    on s1.name = s2.name and s1.id=object_id(@tbl1) and s2.id=object_id(@tbl2) and s1.type=s2.type
     
    /* Types différents */
    insert into #comp 
    select 'Types différents', '*', s1.name from syscolumns s1 inner join syscolumns s2
    on s1.name = s2.name and s1.id=object_id(@tbl1) and s2.id=object_id(@tbl2) and s1.type<>s2.type
     
     
    /* Colonnes surnuméraires */
    insert into #comp 
    select 'Colonne surnuméraire', @Tbl1, name 
    from syscolumns
    where name not in (select name from syscolumns where id=object_id(@tbl2))
    and id=object_id(@tbl1)
     
    /* Colonnes manquantes */
    insert into #comp 
    select 'Colonne surnuméraire', @Tbl2, name 
    from syscolumns
    where name not in (select name from syscolumns where id=object_id(@tbl1))
    and id=object_id(@tbl2)
     
    select * from #comp
     
    drop table #comp
    end
    ... vous pouvez bien évidemment vous passer de la procédure stockée, de la table temporaire et des divers inserts (et les remplaçant par un UNION ALL unique), mais c'est moins lisible...
    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
    Membre expérimenté
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Par défaut
    Dans le même ordre d'idées, il existe le projet OPEN DBDiff
    http://opendbiff.codeplex.com/ qui permet de comparer 2 structures et de générer les scripts.

  5. #5
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    446
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 446
    Par défaut
    J'ai essayé ceci mais ça me donne toutes les colonnes des deux tables, je veux juste savoir si les deux tables ont les memes champs
    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
     
     
    SELECT *, 'Table1' AS Source
    FROM  INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'dbo'
       AND TABLE_NAME = 'Matable1'
    EXCEPT
    SELECT *, 'Table1' AS Source
    FROM  INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'dbo'
       AND TABLE_NAME = 'Matable2'
    UNION ALL
    SELECT *, 'Table2' AS Source
    FROM  INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'dbo'
       AND TABLE_NAME = 'Matable2'
    EXCEPT
    SELECT *, 'Table2' AS Source
    FROM  INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_SCHEMA = 'dbo'
       AND TABLE_NAME = 'Matable1'
    merci pour l'aide

Discussions similaires

  1. Comparer deux tables
    Par ash_rmy dans le forum SAS Base
    Réponses: 3
    Dernier message: 03/11/2009, 16h09
  2. Tableau pour Comparer deux tables
    Par Frog74 dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/04/2008, 10h09
  3. Comparer deux tables
    Par wachoo31 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/10/2007, 19h55
  4. comparer deux tables
    Par khayate dans le forum VB.NET
    Réponses: 1
    Dernier message: 30/07/2007, 17h21
  5. comparer deux tables
    Par moicats dans le forum Access
    Réponses: 4
    Dernier message: 15/05/2006, 16h27

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