0

私は、アプリケーション用の古いSQL 2008バックアップを持っています。今日、私たちはsql-2012の現在のデータベースとして復元したい場合がありました。古いデータベース は533個のテーブルユニークなテーブルの2つのデータベースを比較するには?

を示したのに対し、私は私の現在のデータベースが合計543個のテーブルを返さ

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

両方のデータベース内のテーブルをカウントするには、以下のクエリを使用からユニークな10個のテーブルを見つける方法私の前のデータベースのテーブルと比較することによって、現在のデータベースを更新します。 ?

アップデート1

私はテーブルを比較するには、以下のクエリを使用しますが、これらの2つのクエリは、迅速なアドホッククエリとして、作業を行います

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 - スキーマを使用して、比較する2のデータベースを持っているか、交換して上書きされたデータベースと比較すると、復元だから、 – lad2025

+0

を比較しますか? – sepupic

+0

@sepupic。今は別のデータベースとして復元され、そこから私は新しいものと比較したいです。 – aryan

答えて

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

これは、dbtest02にないテーブルdbtest02を返します。逆について?また、これは異なるスキーマ内の同じ名前の表を考慮しません。 – JiggsJedi

+0

私はOPが逆のチェック – sepupic

+0

はいを​​行うためにこのコードでdbnamesを交換できると思います。その罰金と結果を返します。 – aryan

2

何の結果が返されません。可能性のあるすべての違いを捕らえるには、「両方向」で2回行う必要があります。

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

(全外があまりにも作業に参加します。アンドリューの返信に@基づき、スキーマを更新しましたが、彼らは私の脳を傷つける。)

+0

'information_schema'に対するクエリも同様に機能しますが、すべての情報を入力するのは嫌いです。 –

+0

同じ名前の異なるスキーマに複数のテーブルがある場合はどうなりますか? – JiggsJedi

+0

上記のように私の答えを変更しました。 –

3

このクエリは、テーブル名が繰り返された場合TABLE_SCHEMAを確認するために含んでいるが、中別のスキーマが表示されます。これは、db_1にあるがdb_2ではなく、db_2のテーブルではなく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

真実、私はいつもそれを忘れてしまいます。 +1、私はそれに応じて私のクエリを更新するつもりです。 –

+0

また、ビューも返されます。我々はテーブルのためだけそれを行うことができます – aryan

+0

更新されます。 "where table_type = 'BASE TABLE' –

関連する問題