2016-11-15 4 views
1

Ich habe zwei Datenbanken. Einer ist für Transaktionszwecke und ein anderer ist für Auditingzwecke. Die Datenbanknamen sind CLX_DEVELOPMENT und CLX_DEVELOPMENT_AUDIT. Beide Datenbanken sollten die gleiche Anzahl von Tabellen und Spalten haben.Wie alle Spalten aller Tabellen aus zwei Datenbanken zu vergleichen

Meine Anforderung ist, dass ich überprüfen muss, ob eine Spalte in fehlt.

+0

Beispielausgabe und Tabellenstruktur anzeigen –

+4

SQL Server-Datentools, Schemavergleich. Low-Tech-Lösung: Skript alle Tabellen mit Management Studio, vergleichen Sie mit Ihrem Lieblings-Diff-Tool. Ihre Frage macht nicht klar, ob Sie * schema * oder * data * vergleichen müssen, meine Bemerkung bezieht sich auf die erste. SSDT hat aber auch einen Datenvergleich. –

Antwort

1

Dies kehrt Spalten aus einer Datenbank, die in der entsprechenden Tabelle der anderen Datenbank nicht vorhanden ist:

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 

eine allgemeinere Lösung, die ein Spalt diff von zwei Datenbanken wie folgt erzeugt :

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

Vielen Dank Salman A es funktioniert, aber es zeigt auch Vergleich Vergleich –

+0

@ghayaz siehe überarbeitete Antwort. –

+0

Vielen Dank Salman seine Arbeit tut mir leid, es zeigt sowohl Ansichten als auch Tabellen –

Verwandte Themen