如何从SQL Server中的图表创建备份脚本?

时间:2013-10-31 12:06:56

标签: sql-server sql-server-2008-r2 sql-server-2012

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

我在我的数据库中从所有对象(tables / trigger / stored procedure / function ...)创建一个脚本。

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

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

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

我发现了Link。但我需要一些人认为自动创建所有脚本(插入命令)。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

脚本化数据库不包含图表,因为它们不是服务器对象,其方式与表或存储过程相同;它们作为sysdiagrams表中的数据存在。

关于SO的类似问题问How do you migrate SQL Server Database Diagrams to another Database?

接受的答案是将sysdiagrams表的内容复制到新数据库,因此您可以在脚本中包含表内容。 answer with the most up-votes指向scripting diagrams的链接。

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

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

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

<强>更新

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

enter image description here

因此,虽然看起来有可能在从脚本创建的新数据库中创建图表并不容易。继续给出有关脚本图的答案,并根据自己的需要进行修改。

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

答案 2 :(得分:0)

这是一个快速的&amp;我使用的脏方法。由于查询窗口不会显示定义字段的完整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&amp; 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. 删除行&amp;来自插入的/ row XML标记,并在目标服务器上运行它们。如果要用新值替换所有值,则可以截断sysdiagrams表。