SQL Server データベース ダイアグラムを開発者向けの SQL スクリプトとしてエクスポートするにはどうすればよいですか?
開発者にとって使いやすいとは、既存のソリューションUPDATE
で使用される乱雑な多数のスタイルとは対照的に、人間がそれらを記述する方法と同様の方法で記述されることを意味します。
(このサイトの同様の質問は、特定のバージョンの SQL Server または図の移行のみを対象としているように見えることに注意してください。)
SQL Server データベース ダイアグラムを開発者向けの SQL スクリプトとしてエクスポートするにはどうすればよいですか?
開発者にとって使いやすいとは、既存のソリューションUPDATE
で使用される乱雑な多数のスタイルとは対照的に、人間がそれらを記述する方法と同様の方法で記述されることを意味します。
(このサイトの同様の質問は、特定のバージョンの SQL Server または図の移行のみを対象としているように見えることに注意してください。)
これを行うスクリプトを次に示します。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 に表示するには、[データベース ダイアグラム] ノードを展開し、作成を求められたら[はい] をクリックする必要があると思います。
これはhereの 2008 年のスクリプトに基づいています。
落とし穴があるので注意!SSMS およびその他の Microsoft ツールは、結果セット内の結果のテキストを切り捨てます (図が多数ある場合)。全文を取得するために、クエリを実行して出力をクリップボードに入れる PowerShell スクリプトを次に示します。
$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
データベース、インスタンス名、および SQL プレースホルダーを入力します。