2011-03-10 8 views
1

J'essaie de comparer les schémas de deux tables qui existent dans différentes bases de données. , Je Jusqu'à présent cette requêteComment puis-je comparer des tables dans deux bases de données différentes en utilisant SQL?

SELECT * FROM sys.columns WHERE object_id = OBJECT_ID('table1')

La seule chose est que je ne sais pas comment utiliser les sys.columns pour faire référence à une base de données autre que celui que la requête est connecté. J'ai essayé

SELECT * FROM db.sys.columns WHERE object_id = OBJECT_ID('table1')

mais il n'a rien trouvé. J'utilise SQL Server 2005

Des suggestions? Merci!

Répondre

3

Jetez un oeil à redgate's SQL Compare.

Pour répondre à votre question spécifique, vous devez qualifier complètement la référence du tableau.

SELECT * FROM db.sys.columns WHERE object_id = OBJECT_ID('db.SchemaName.table1') 
+0

Je sais que je peux le faire avec Redgate, mais j'essaye de le faire par programmation. Y at-il un moyen de le faire via sql seulement? – chama

+0

@chama: J'ai édité ma réponse pour répondre à votre question initiale. –

2

tout ce que vous avez besoin est de spécifier le nom DB et shcema lorsque vous appelez la fonction OBJECT_ID, comme:

SELECT * 
FROM DB_NAME.sys.columns 
WHERE object_id = OBJECT_ID('DB_NAME.SHCEMA_NAME.table1') 
1

Essayez le information_schema. par exemple:

select * 
from 
    db1.information_schema.columns col1 
    join db2.information_schema.columns col2 
    on col1.table_catalog = col2.table_catalog 
    and col1.table_schema = col2.table_schema 
    and col1.column_name = col2.column_name 
... 

Le information_schema simplifie coller ensemble les informations de tous les sys.columns, sys.objects etc. Il existe automatiquement dans votre DB. Je pense que c'est en fait une norme ISO, donc devrait fonctionner sur différents systèmes de DB.

Plus d'informations sur le information_schema se trouve here

0

comparaison si l'objet ou des colonnes existe dans les deux schémas est seulement un petit peu de la solution. Et s'ils existent dans les deux bases de données mais sont différents? Pour mon projet bsn ModuleStore, j'ai implémenté une routine de script qui en réalité écrase la plupart des objets DB, y compris les colonnes de table et de vue, les index, les espaces de noms, etc. en XML en utilisant le code T-SQL uniquement. C'est peut-être un bon point de départ. Vous pouvez le trouver sur Google code, et le fichier en question (qui génère la requête SQL pour le dumping du schéma d'objet en XML) est here.

3

En retard, mais j'espère utile.

Même si Chama a demandé des solutions SQL, je recommanderais quand même d'utiliser des outils tiers tels que ApexSQL Diff ou des outils de Red Gate Joe déjà mentionnés (j'ai utilisé les deux et ils ont bien fonctionné).

Raison est que la requête pour comparer deux tables en utilisant le schéma d'information doit être assez complexe afin d'attraper toutes les différences. Notez que tous les exemples mentionnés ici ne couvrent que les colonnes, mais aucune des requêtes présentées ici ne montrera la différence entre nvarchar (20) et nvarchar (50) ou la différence dans les clés ou index étrangers ou ....

La réponse courte est oui - cela est possible en utilisant des vues de schéma d'informations mais cela peut être assez complexe si vous voulez comparer chaque détail de ces deux tables.

+0

Je +1 car Dwoolk est correct à 100%. L'écriture de votre propre routine de comparaison SQL n'attrape qu'une petite fenêtre de tous les objets possibles qu'une table peut hériter. L'utilisation d'outils tels que mentionnés ci-dessus vous donnera une vue beaucoup plus large de la table, y compris tous les index, les déclencheurs, les contraintes, etc. (même les données à comparer) pour voir l'image complète. J'utilise personnellement Toad pour SQL Server. Il a un fantastique schéma SQL comparer qui fait le lot. – Fandango68

0

Code -

drop table #a 
drop table #b 


select * 
into #a 
from [databasename1].information_schema.columns a 
--where table_name = 'aaa' 


select * 
into #b 
from [databasename2].information_schema.columns b -- add linked server name and db as needed 


--where table_name = 'bbb' 


select distinct(a.table_name), b.TABLE_SCHEMA+ '.' + (b.table_name) TableName,b.TABLE_CATALOG DatabaseName 
from #a a 


right join #b b 


on a.TABLE_NAME = b.TABLE_NAME and a.TABLE_SCHEMA = b.TABLE_SCHEMA 
where a.table_name is null-- and a.table_name not like '%sync%' 
Questions connexes