9

Wie kann ich SQL Server-Datenbankdiagramme als entwicklerfreundliche SQL-Skripts exportieren?Wie kann ich SQL Server-Datenbankdiagramme scripten?

von entwicklerfreundliche, ich meine in ähnlicher Weise wie die Art und Weise geschrieben ein Mensch sie die chaotische viel UPDATE s Stil von existing solutions verwendet im Gegensatz schreiben würde.

(Beachten Sie, dass ähnliche Fragen auf dieser Seite scheint nur bestimmte Versionen von SQL Server oder Migration von Diagrammen zu decken.)

Antwort

15

hier ein Skript, dies zu tun. Server 2008 R2 getestet in SQL und 2012.

DECLARE @values nvarchar(max); 
SET @values = 
(
    SELECT ' 
     (''' + REPLACE(name, '''', '''''') + ''', ' + CAST(principal_id AS VARCHAR(100)) +', ' + CAST(version AS VARCHAR(100)) + ', ' + sys.fn_varbintohexstr(definition) + '),' 
    FROM sysdiagrams 
    FOR XML PATH(''), TYPE 
).value('.', 'nvarchar(max)'); 
SET @values = LEFT(@values, LEN(@values) - 1); 

SELECT 
'IF OBJECT_ID(N''dbo.sysdiagrams'') IS NULL 
    CREATE TABLE dbo.sysdiagrams 
    (
     name sysname NOT NULL, 
     principal_id int NOT NULL, 
     diagram_id int PRIMARY KEY IDENTITY, 
     version int, 

     definition varbinary(max) 
     CONSTRAINT UK_principal_name UNIQUE 
     (
      principal_id, 
      name 
     ) 
    ); 

MERGE sysdiagrams AS Target 
    USING 
    (
     VALUES' + @values + ' 
    ) AS Source (name, principal_id, version, definition) 
    ON Target.name = Source.name 
     AND Target.principal_id = Source.principal_id 
    WHEN MATCHED THEN 
     UPDATE SET version = Source.version, definition = Source.definition 
    WHEN NOT MATCHED BY Target THEN 
     INSERT (name, principal_id, version, definition) 
     VALUES (name, principal_id, version, definition); 
'; 

Es exportiert grundsätzlich den Inhalt der sysdiagrams Tabelle. Beachten Sie, dass die ID-Nummern der Diagramme nicht beibehalten werden. Es behält auch bei, wer die Diagramme erstellt hat, aber die ID-Nummer sollte auch in der Zieldatenbank vorhanden sein.

Wenn Sie das resultierende Skript auf einer Serverinstanz ausführen, die keine Datenbankdiagrammobjekte enthält, sollte es dennoch funktionieren. Damit dies jedoch in SSMS angezeigt wird, müssen Sie den Knoten Datenbankdiagramm erweitern und auf Ja klicken, wenn Sie aufgefordert werden, sie zu erstellen.

Dies basiert auf dem Skript 2008 von here.

Beachten Sie, dass es einen Haken gibt! SSMS und andere Microsoft-Tools schneiden den resultierenden Text in der Ergebnismenge ab, wenn Sie mehr als ein paar Diagramme haben. Um den vollständigen Text zu erhalten, hier ist ein Powershell-Skript die Abfrage aus und legen Sie die Ausgabe in der Zwischenablage laufen:

$ErrorActionPreference = "Stop" 

function Pause([string]$message) { 
    Write-Host $message 
    $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | Out-Null 
} 

function Set-Clipboard { 
    $input | PowerShell -NoProfile -STA -Command { 
     Add-Type -AssemblyName "System.Windows.Forms" 
     [Windows.Forms.Clipboard]::SetText($input) 
    } 
} 

$connection = New-Object System.Data.SqlClient.SqlConnection ("Data Source=DATABASE_INSTANCE;Initial Catalog=DATABASE;Integrated Security=SSPI") 
$connection.Open() 
$command = $connection.CreateCommand() 
$command.CommandText = @" 
--SQL CODE 
"@ 

$command.CommandTimeout = 60 
$result = $command.ExecuteScalar() 
$command.Dispose() 
$connection.Dispose() 

Pause "Press any key to copy the resulting SQL to the clipboard..." 
$result | Set-Clipboard 

Füllen Sie die Datenbank, die Instanznamen und SQL-Platzhalter.

Verwandte Themen