9

SQL Server 데이터베이스 다이어그램을 개발자 친숙한 SQL 스크립트로 내보내려면 어떻게해야합니까? 개발자 친화적 인으로SQL Server 데이터베이스 다이어그램을 스크립팅하는 방법은 무엇입니까?

는, 나는 existing solutions에 의해 사용 된 지저분한 많은 - UPDATE의 스타일과 반대로 인간을 작성하는 방법과 유사한 방식으로 작성 의미.

(이 사이트에 그와 유사한 질문을 참고는 SQL Server 또는 다이어그램의 마이그레이션의 특정 버전을 포함하는 것.)

답변

15

가 여기에이 작업을 수행하는 스크립트입니다. SQL Server 2008 R2의 테스트 및 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); 
'; 

그것은 기본적으로 sysdiagrams 테이블의 내용을 보냅니다. 다이어그램의 ID 번호는 유지되지 않습니다. 또한 다이어그램을 만든 사람은 그대로 있지만 ID 번호도 대상 데이터베이스에 있어야합니다.

데이터베이스 다이어그램 작성 개체가없는 서버 인스턴스에서 결과 스크립트를 실행하는 경우에도 여전히 작동해야합니다. 그러나이 작업을 수행 한 후에 SSMS에 나타나게하려면 데이터베이스 다이어그램 노드를 확장하고 노드를 만들지 묻는 메시지가 나타나면 을 클릭해야합니다.

이것은 2008 년 스크립트 here을 기반으로합니다.

캐치가 있음을 유의하십시오! SSMS 및 기타 Microsoft 도구는 다이어그램이 두 개 이상인 경우 결과 집합의 결과 텍스트를 자릅니다. 데이터베이스, 인스턴스 이름 및 SQL 자리 표시자를

$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 

채우기 : 전체 텍스트를 얻으려면, 여기에 쿼리를 실행하고 클립 보드에 출력을 넣어 PowerShell 스크립트입니다.