【问题标题】:How can I script SQL Server database diagrams?如何编写 SQL Server 数据库图表脚本?
【发布时间】:2013-08-17 07:18:49
【问题描述】:

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

对开发者友好,我的意思是写成类似于人类写它们的方式,而不是 existing solutions 使用的凌乱的 many-UPDATEs 风格。 p>

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

【问题讨论】:

    标签: sql-server-2008 tsql sql-server-2008-r2 sql-server-2012 database-diagram


    【解决方案1】:

    这是执行此操作的脚本。在 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 中,我认为您需要展开 Database Diagrams 节点并在要求创建它们时单击 Yes

    这是基于 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 占位符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多