2016-11-15 3 views
1

私は2つのデータベースを持っています。 1つはトランザクション目的であり、もう1つは監査目的です。データベース名はCLX_DEVELOPMENTCLX_DEVELOPMENT_AUDITです。どちらのデータベースも同じ数の表と列を持つ必要があります。2つのデータベースからすべてのテーブルのすべての列を比較する方法

私の要件は、CLX_DEVELOPMENT_AUDITに列がないかどうかをチェックすることです。

+0

サンプル出力とテーブル構成を示します –

+4

SQL Serverデータツール、スキーマ比較。ローテクソリューション:Management Studioを使用してすべてのテーブルをスクリプト化し、お気に入りの差分ツールと比較します。あなたが* schema *や* data *を比較する必要があるかどうかの質問は、私の発言は前者に関係していることを明確にしていません。 SSDTにもデータ比較があります。 –

答えて

1

これは、他のデータベースの対応テーブルに存在しない一件のデータベースから列を返します。次のように列差分を2つのデータベースのを生成するより一般的な解決策である

WITH DB1 AS (
    SELECT objects.name AS TBL, columns.name AS COL 
    FROM  CLX_DEVELOPMENT.sys.objects 
    INNER JOIN CLX_DEVELOPMENT.sys.columns ON objects.object_id = columns.object_id 
    WHERE objects.type = 'U' -- user table 
), DB2 AS (
    SELECT objects.name AS TBL, columns.name AS COL 
    FROM  CLX_DEVELOPMENT_AUDIT.sys.objects 
    INNER JOIN CLX_DEVELOPMENT_AUDIT.sys.columns ON objects.object_id = columns.object_id 
    WHERE objects.type = 'U' -- user table 
) 
SELECT DB1.TBL, DB1.COL 
FROM DB1 
LEFT JOIN DB2 ON DB1.TBL = DB2.TBL and DB1.COL = DB2.COL 
WHERE DB2.TBL IS NULL 

WITH CTE AS (
    SELECT TABLE_NAME, COLUMN_NAME FROM Database1.INFORMATION_SCHEMA.COLUMNS 
    UNION 
    SELECT TABLE_NAME, COLUMN_NAME FROM Database2.INFORMATION_SCHEMA.COLUMNS 
) 
SELECT CTE.TABLE_NAME, CTE.COLUMN_NAME, CASE 
    WHEN DB1.COLUMN_NAME IS NULL THEN 'DB2 Only' 
    WHEN DB2.COLUMN_NAME IS NULL THEN 'DB1 Only' 
    ELSE 'BOTH DB' 
END AS [Present In] 
FROM CTE 
LEFT JOIN Database1.INFORMATION_SCHEMA.COLUMNS AS DB1 ON CTE.TABLE_NAME = DB1.TABLE_NAME AND CTE.COLUMN_NAME = DB1.COLUMN_NAME 
LEFT JOIN Database2.INFORMATION_SCHEMA.COLUMNS AS DB2 ON CTE.TABLE_NAME = DB2.TABLE_NAME AND CTE.COLUMN_NAME = DB2.COLUMN_NAME 
WHERE DB1.COLUMN_NAME IS NULL OR DB2.COLUMN_NAME IS NULL 
+0

Salmanさん、ありがとうございますが、それはまた、ビューの比較を示しています –

+0

@ハヤズ改訂版の回答を参照してください。 –

+0

Salmanさん、ありがとうございましたごめんなさい、両方のビューとテーブルを表示しています –

関連する問題