2

我使用 SQL Server 2012 和 SQL Server 2008 R2。

我从数据库中的所有对象(表/触发器/存储过程/函数...)创建一个脚本。

我从 SQL Server Management Studio 生成了这个脚本。我可以在另一台服务器上使用此脚本重新创建我的数据库。但是在运行我的脚本以创建另一个数据库后,我错过了我的数据库的所有图表。

因此,我需要从数据库中存在的所有图表创建备份脚本。

我需要在目标数据库上执行这个脚本来重新创建我的所有图表。

我找到了这个链接。但我需要一些想法来自动创建所有脚本(插入命令)。

4

3 回答 3

8

我找到了一个合理的解决方案。问题是 Management Studio 不能为非 XML 数据显示超过 65535 个字符,并且不能设置为显示超过 65535 个字符。

请参阅文档代码:)

备份脚本:

-- 1. Read from DB, using XML to workaround the 65535 character limit
declare @definition varbinary(max)
select @definition = definition from dbo.sysdiagrams where name = 'ReportingDBDiagram' 

select
    '0x' + cast('' as xml).value('xs:hexBinary(sql:variable("@definition") )', 'varchar(max)')
for xml path('')

-- 2. Open the result XML in Management Studio
-- 3. Copy the result
-- 4. Paste this in backup script for @definition variable

恢复脚本:

declare @definition varbinary(max)
set @definition = 0xD0CF -- Paste 0x0 value from Backup script

-- Create diagram using 'official' Stored Procedure
exec dbo.sp_creatediagram
    @diagramname = 'ReportingDBDiagramCopy',
    @owner_id = null,
    @version = 1,
    @definition = @definition
于 2014-11-12T10:02:31.487 回答
2

编写数据库脚本不包括图表,因为它们与表或存储过程不同,它们不是服务器对象;它们作为数据存在于sysdiagrams表中。

SO上的一个类似问题问如何将SQL Server数据库图表迁移到另一个数据库?

公认的答案是将sysdiagrams表的内容复制到新数据库中,这样您就可以在脚本中包含表内容。投票最多的答案有一个链接到脚本图表的方式。

我尝试备份然后将数据库恢复到同一台服务器,删除我创建的图表(我只有一个),然后运行以下查询:

INSERT  INTO database2.dbo.sysdiagrams
        ( 
         NAME
        ,principal_id
        ,version
        ,DEFINITION
        )
        SELECT  NAME
               ,principal_id
               ,version
               ,DEFINITION
        FROM    database1.dbo.sysdiagrams 

该图已成功恢复,但是我确实在恢复的备份上执行了此操作,我应该使用从脚本生成的新数据库对其进行测试。

更新:

我编写了一个数据库脚本,然后从中创建了一个新数据库。尝试使用INSERT语句重建图表时出现错误

在此处输入图像描述

因此,尽管在从脚本创建的新数据库中创建图表似乎并非易事。使用有关脚本图的答案并根据您自己的需要进行修改。

也许您可以进一步调查并发布您自己的答案:)

于 2013-10-31T13:03:43.487 回答
1

这是我使用的一种快速而肮脏的方法。由于查询窗口不会显示定义字段的完整 varbinary(max) 值,但 XML 编辑器会显示,我将行输出到 XML,如下所示:

  1. 在包含图表的服务器/数据库上运行以下查询:

    SELECT 'INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('''+name+''','
    +CONVERT(varchar(2),principal_id)+','+CONVERT(varchar(2),diagram_id)+','+CONVERT(varchar(2),version)+','
    +'0x' + CAST('' as xml).value('xs:hexBinary(sql:column("definition"))','varchar(max)') +')'
    FROM RCSQL_ClaimStatus.dbo.sysdiagrams
    FOR XML PATH
    
  2. 单击生成的链接打开 XML 结果,然后 ctrl-a & ctrl-c 复制所有生成的行。

  3. 将该输出粘贴回您的查询窗口。我通常将它粘贴在一对 IDENTITY_INSERT 之间,如下所示:

    --TRUNCATE TABLE sysdiagrams
    SET IDENTITY_INSERT sysdiagrams ON;
    <row>INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('ERD1',1,1,1,0xD0CF11E0A1B11AE100000...)</row>
    <row>INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('ERD2',1,2,1,0xD0CF11E0A1B11AE100000...)</row>
    <row>INSERT sysdiagrams(name,principal_id,diagram_id,version,definition) VALUES('ERD3',1,3,1,0xD0CF11E0A1B11AE100000...)</row>
    SET IDENTITY_INSERT sysdiagrams OFF;
    
  4. 从插入中删除 row & /row XML 标记,并在目标服务器上运行它们。如果您用新值替换所有值,则可以截断 sysdiagrams 表。

于 2017-06-28T18:27:43.940 回答