9

Tôi làm cách nào để xuất biểu đồ cơ sở dữ liệu SQL Server thành các tập lệnh SQL thân thiện với nhà phát triển?Làm cách nào để tôi có thể tạo biểu đồ cơ sở dữ liệu SQL Server?

By phát triển thân thiện với, tôi có nghĩa là viết theo một cách tương tự như cách một con người sẽ viết chúng như trái ngược với lộn xộn many- UPDATE s phong cách được sử dụng bởi existing solutions.

(Lưu ý rằng câu hỏi tương tự trên trang web này chỉ dường như để trang trải các phiên bản cụ thể của SQL Server hoặc di cư của sơ đồ.)

Trả lời

15

Dưới đây là một kịch bản để làm điều này. Được thử nghiệm trong SQL Server 2008 R2 và 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); 
'; 

Về cơ bản, xuất nội dung của bảng sysdiagrams. Lưu ý rằng nó không giữ lại số id của biểu đồ. Nó cũng giữ lại những người tạo ra các sơ đồ, nhưng số id cũng phải tồn tại trong cơ sở dữ liệu đích.

Nếu bạn chạy tập lệnh kết quả trên một cá thể máy chủ không có đối tượng sơ đồ cơ sở dữ liệu, nó vẫn hoạt động. Tuy nhiên, sau khi thực hiện việc này, để chúng xuất hiện trong SSMS, tôi nghĩ bạn cần mở rộng sơ đồ Cơ sở dữ liệu Sơ đồ cơ sở dữ liệu và nhấp vào khi được yêu cầu tạo chúng.

Điều này được dựa trên tập lệnh 2008 từ here.

Lưu ý rằng có sự bắt giữ! SSMS và các công cụ khác của Microsoft cắt ngắn văn bản kết quả trong tập kết quả nếu bạn có nhiều sơ đồ. Để có được toàn văn, đây là tập lệnh PowerShell để chạy truy vấn và đưa đầu ra vào khay nhớ tạm:

$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 

Điền vào cơ sở dữ liệu, tên cá thể và trình giữ chỗ SQL.