가 여기에이 작업을 수행하는 스크립트입니다. 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 스크립트입니다.