1

Ich habe 21 DBs auf dem gleichen Server, die "das gleiche Schema haben sollen" (das Schema wird ab sofort nur auf das Tabellenschema beschränkt), aber das tun sie nicht. In der Umgebung, die ich bin, kann ich kein Tool/Anwendungen gemäß den Compliance-Regeln installieren. Der einzige Weg, der mir einfällt, ist, das Schema aller 21 DBs in Excel hochzuziehen und zu vergleichen, aber es ist langweilig.MSSQL Schema Vergleichen von T SQL

Kann mir jemand bei der Entwicklung eines T-SQL helfen, der das Schema für alle 21 DBs vergleichen und die Unterschiede hervorheben kann?

Dies sind die Spalten ich brauche: Table_Name, Spaltenname, Datentyp, Max Länge, IS_NULLABLE, is_replicated, Primary Key

Die folgende T-SQL zieht für mich in Informationen auf. Ich brauche eine Vorstellung darüber, wie kann ich diese Informationen für 21 DBs vergleichen

SELECT a.name Table_Name, c.name 'Column Name', 
    t.Name 'Data type', 
    c.max_length 'Max Length', 
    c.is_nullable,a.is_replicated , 
    ISNULL(i.is_primary_key, 0) 'Primary Key' 
FROM Sys.tables a inner join  sys.columns c 
On A.object_id=C.object_id 
INNER JOIN 
    sys.types t ON c.user_type_id = t.user_type_id 
LEFT OUTER JOIN 
    sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id 
LEFT OUTER JOIN 
    sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id 
    Order by 1,2 

Ich brauche einen Ausgangspunkt

+0

und markieren Sie die Unterschiede? Welche Unterschiede? – TheGameiswar

+0

Wenn eines der 7 Felder für eine bestimmte Tabelle für die 21 DBs unterschiedlich ist - das ist ein Unterschied. Ich freue mich, wenn ich das Ergebnis für 21 DBs in eine temporäre Tabelle setzen und dann die temporäre Tabelle nach Unterschieden abfragen kann. Etwas in diesen Zeilen ... –

+0

In Visual Studio gibt es einen Tools> Sql Server> Neuer Schemavergleich, der zwei Quellen unterscheidet. Vielleicht lohnt sich ein Blick darauf. – Phritzy

Antwort

1

Ich habe die ganze Zeit unter ähnlichen Einschränkungen wie diese Dinge zu tun, auch ohne den Vorteil der die professionellen Werkzeuge dafür entworfen. Hier ist eine Möglichkeit:

Erstellen Sie zunächst eine temporäre Tabelle die Tabelleninformationen zu halten:

CREATE TABLE #DbSchemas(
    DbName nvarchar(128) NULL, 
    Table_Name sysname NOT NULL, 
    [Column Name] sysname NULL, 
    [Data type] sysname NOT NULL, 
    [Max Length] smallint NOT NULL, 
    is_nullable bit NULL, 
    is_replicated bit NULL, 
    [Primary Key] bit NOT NULL 
) 
GO 

Dann wickeln Sie die Abfrage, die Sie bereits im undokumentierte System Prozedur sp_MSforeachdb ausführen es auf jede Datenbank, und fügte hinzu, die Ergebnisse in die #DbSchemas Tabelle:

EXECUTE master.sys.sp_MSforeachdb 'USE [?]; 
    INSERT INTO #DbSchemas 
    SELECT DB_NAME() DbName, a.name Table_Name, c.name [Column Name], 
     t.Name [Data type], 
     c.max_length [Max Length], 
     c.is_nullable,a.is_replicated , 
     ISNULL(i.is_primary_key, 0) [Primary Key] 
    FROM Sys.tables a inner join  sys.columns c 
    On A.object_id=C.object_id 
    INNER JOIN 
     sys.types t ON c.user_type_id = t.user_type_id 
    LEFT OUTER JOIN 
     sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id 
    LEFT OUTER JOIN 
     sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id 
     Order by 1,2 
    ; 
'; 
go 

Jetzt sollten Sie die Daten aus jeder Datenbank in der #DbSchemas Tabelle abzufragen fähig sein:

select * from #DbSchemas where Dbname = 'master' 

Schließlich, sie vergleichen Sie so etwas wie diese verwenden:

SELECT * FROM #DbSchemas s1 
WHERE DbName = 'msdb' 
    AND NOT EXISTS(
    SELECT * FROM #DbSchemas s2 
    WHERE s2.DbName   = 'master' 
     AND s2.Table_Name  = s1.Table_Name 
     AND s2.[Column Name] = s1.[Column Name] 
     AND s2.[Data type]  = s1.[Data type] 
     AND s2.[Max length]  = s1.[Max length] 
     AND s2.is_nullable  = s1.is_nullable 
     AND s2.is_replicated = s1.is_replicated 
     AND s2.[Primary Key] = s1.[Primary Key] 
    ) 
+1

Genau das habe ich gebraucht. Du bist toll –