如何编写SQL Server数据库图表的脚本?

Sam*_*Sam 11 t-sql sql-server-2008 sql-server-2008-r2 database-diagram sql-server-2012

如何将SQL Server数据库图表导出为开发人员友好的SQL脚本?

开发人员友好,我的意思是以类似于人类编写方式的方式编写,而不是现有解决方案UPDATE使用的混乱多种方式.

(请注意,此站点上的类似问题似乎只涵盖特定版本的SQL Server或图表迁移.)

Sam*_*Sam 18

这是一个执行此操作的脚本.在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);
';
Run Code Online (Sandbox Code Playgroud)

它基本上导出sysdiagrams表的内容.请注意,它不会保留图表的ID号.它还保留了创建图表的人员,但id号码也应该存在于目标数据库中.

如果在没有数据库图表对象的服务器实例上运行结果脚本,它仍然可以工作.但是,执行此操作后,为了使它们出现在SSMS中,我认为您需要展开Database Diagrams节点,并在要求创建它们时单击Yes.

这是基于此处的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
Run Code Online (Sandbox Code Playgroud)

填写数据库,实例名称和SQL占位符.