0

J'ai une ancienne sauvegarde SQL 2008 pour notre application. Aujourd'hui, nous avons rencontré un cas où nous voulons le restaurer en tant que base de données actuelle dans notre sql-2012. J'ai utilisé la requête ci-dessous pour compter les tables dans les deux bases de donnéesComment comparer deux bases de données pour des tables uniques?

USE YOURDBNAME 
SELECT COUNT(*) from information_schema.tables 
WHERE table_type = 'base table' 

ma base de données actuelle retourné 543 au total des tables alors ancienne base de données a montré 533 tables

Comment trouver les dix uniques tables de la base de données actuelle en la comparant avec les tables de ma base de données précédente. ?

Update 1

J'utilise la requête ci-dessous pour comparer les tableaux, mais il ne donne aucun résultat

select 'dbtest01' as dbname, t1.table_name 
from dbtest01.[INFORMATION_SCHEMA].[tables] t1 
where table_name not in (select t2.table_name 
    from 
    dbtest02.[INFORMATION_SCHEMA].[tables] t2 
    ) 
union 
select 'dbtest02' as dbname, t1.table_name 
from dbtest02.[INFORMATION_SCHEMA].[tables] t1 
where table_name not in (select t2.table_name 
    from 
    dbtest01.[INFORMATION_SCHEMA].[tables] t2 
    ) 
+2

SSDT - schéma comparer – lad2025

+0

Vous avez donc 2 base de données pour comparer ou vous avez restauré avec le remplacer et que vous voulez comparer avec la base de données écrasées? – sepupic

+0

@sepupic. Maintenant, il est restauré en tant que base de données séparée et à partir de là, je veux comparer avec le nouveau. – aryan

Répondre

1
SELECT table_name from dbtest01.information_schema.tables 
WHERE table_type = 'base table' 

EXCEPT 

SELECT table_name from dbtest02.information_schema.tables 
WHERE table_type = 'base table' 
+0

Cela retournera uniquement les tables trouvées dans dbtest01 qui ne sont pas dans dbtest02 - quoi à propos de l'inverse? En outre, cela ne tient pas compte des tables portant le même nom dans des schémas différents. – JiggsJedi

+0

Je pense que OP est capable d'échanger des noms de domaine dans ce code pour faire la vérification inverse – sepupic

+0

oui. son amende et le retour du résultat. – aryan

2

Ces deux requêtes feront le travail, comme ad-hoc rapide requête. Vous devez le faire deux fois, dans "deux directions", pour attraper toutes les différences possibles.

-- All tables in dbtest01 that are not in dbtest02 
SELECT schema_name(schema_id), name 
from dbtest01.sys.tables 
except select schema_name(schema_id), name 
from dbtest02.sys.tables 
order by name 

-- All tables in dbtest02 that are not in dbtest01 
SELECT schema_name(schema_id), name 
from dbtest01.sys.tables 
except select schema_name(schema_id), name 
from dbtest02.sys.tables 
order by name 

(Mise à jour avec des schémas, basés sur @ réponse d'Andrew. Jointures externes complètes fonctionne aussi, mais ils font du mal mon cerveau.)

+0

Les requêtes contre 'information_schema' fonctionneront également, mais je déteste taper tout ça. –

+0

Que se passe-t-il s'il existe plusieurs tables dans des schémas différents portant le même nom? – JiggsJedi

+0

Modifié ma réponse, comme ci-dessus. –

3

Cette requête comprend table_schema pour vous assurer que si le nom de la table est répétée mais en un schéma différent, puis il apparaît. Cela montre les tables qui sont dans db_1 mais pas dans db_2 ainsi que les tables dans db_2 mais pas dans db_1.

SELECT 
    db1.dbname AS db1_name, 
    db1.table_schema AS db1_schema, 
    db1.table_name AS db1_table, 
    db2.dbname AS db2_name, 
    db2.table_schema AS db2_schema, 
    db2.table_name AS db2_table 
FROM (
    SELECT 
     'YOURDBNAME' AS dbname, 
     table_schema, 
     table_name 
    FROM YOURDBNAME.information_schema.tables 
    WHERE table_type = 'BASE TABLE' 
    ) AS db1 
FULL OUTER JOIN (
    SELECT 
     'YOUROTHERDBNAME' AS dbname, 
     table_schema, 
     table_name 
    FROM YOUROTHERDBNAME.information_schema.tables 
    WHERE table_type = 'BASE TABLE' 
    ) AS db2 ON 
    db1.table_schema = db2.table_schema 
    AND db1.table_name = db2.table_name 
WHERE db1.dbname IS NULL 
    OR db2.dbname IS NULL 
+0

C'est vrai, j'oublie toujours ça. +1, et je vais mettre à jour ma requête en conséquence. –

+0

Il renvoie également des vues. Peut-on le faire seulement pour les tables – aryan

+0

Mis à jour. Ajouté "où table_type = 'BASE TABLE' –