我有兩個數據庫。一個用於交易目的,另一個用於審計目的。數據庫名稱是CLX_DEVELOPMENT
和CLX_DEVELOPMENT_AUDIT
。這兩個數據庫應該有相同數量的表和列。如何比較兩個數據庫中所有表的所有列
我的要求是我必須檢查CLX_DEVELOPMENT_AUDIT
中是否缺少任何列。
我有兩個數據庫。一個用於交易目的,另一個用於審計目的。數據庫名稱是CLX_DEVELOPMENT
和CLX_DEVELOPMENT_AUDIT
。這兩個數據庫應該有相同數量的表和列。如何比較兩個數據庫中所有表的所有列
我的要求是我必須檢查CLX_DEVELOPMENT_AUDIT
中是否缺少任何列。
這將返回從一個數據庫中不存在於其他數據庫的相應的表列:
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
的更通用的解決方案,其產生柱DIFF兩個數據庫的是如下:
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
謝謝薩爾曼A它正在工作,但它也顯示視圖比較 –
@ ghayaz看到修訂答案。 –
謝謝薩爾曼的工作抱歉,它顯示了兩個視圖以及表格 –
顯示示例輸出和tabel結構 –
SQL Server數據工具架構比較。低科技解決方案:使用Management Studio編寫所有表格,並與您最喜愛的差異工具進行比較。你的問題沒有說明你是否需要比較* schema *或* data *,我的評論與前者有關。不過,SSDT也有數據比較。 –