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

Sql server 如何从SQL Server中的图表创建备份脚本?,sql-server,sql-server-2008-r2,sql-server-2012,Sql Server,Sql Server 2008 R2,Sql Server 2012,我使用SQL Server 2012和SQL Server 2008 R2 我从数据库中的所有对象(表/触发器/存储过程/函数…)创建脚本 我从SQLServerManagementStudio生成了这个脚本。我可以在另一台服务器上用这个脚本重新创建数据库。但在运行创建另一个数据库的脚本后,我错过了数据库的所有图表 因此,我需要从数据库中存在的所有图表中创建备份脚本 我需要在目标数据库上执行此脚本,以重新创建我的所有图表 我找到了这个。但是我需要一些自动创建所有脚本(Insert命令)的想法。为

我使用SQL Server 2012和SQL Server 2008 R2

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

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

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

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


我找到了这个。但是我需要一些自动创建所有脚本(Insert命令)的想法。

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

一个类似的问题就此提出

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

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

INSERT  INTO database2.dbo.sysdiagrams
        ( 
         NAME
        ,principal_id
        ,version
        ,DEFINITION
        )
        SELECT  NAME
               ,principal_id
               ,version
               ,DEFINITION
        FROM    database1.dbo.sysdiagrams 
该关系图已成功还原,但是,我在还原的备份上执行了此操作,我应该使用脚本生成的新数据库对其进行测试

更新:

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

因此,尽管看起来有可能,但在由脚本创建的新数据库中创建图表并不是件小事。按照给出的关于脚本关系图的答案进行操作,并根据自己的需要进行修改


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

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

有关文档,请参见代码:)

备份脚本:

还原脚本:


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

  • 在包含关系图的服务器/数据库上运行以下查询:

    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
    
  • 单击生成的链接打开XML结果,并按ctrl-a&ctrl-c复制生成的所有行

  • 将该输出粘贴回查询窗口。我通常将其粘贴在一对标识之间,如下所示:

    --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;
    
    ——截断表系统图
    设置IDENTITY\u INSERT系统图打开;
    插入系统图(名称、主体id、图id、版本、定义)值('ERD1',1,1,1,0xD0CF11E0A1B11AE100000…)
    插入系统图(名称、主体id、图id、版本、定义)值('ERD2',1,2,1,0xD0CF11E0A1B11AE100000…)
    插入系统图(名称、主体id、图id、版本、定义)值('ERD3',1,3,1,0xD0CF11E0A1B11AE100000…)
    将IDENTITY_INSERT系统图设置为OFF;
    
  • 从插入中删除行和/行XML标记,并在目标服务器上运行它们。如果要用新值替换所有值,可以截断sysdiagrams表


  • 看看这里,它非常详细地描述了你正在尝试做什么,你能澄清一下你正在尝试支持什么吗?你说“我只想从我的图表中创建备份脚本”你想保存图表还是图表中的对象?你的链接不起作用:404-找不到OK我改变我的问题。Muhammed Ali给出的链接对我有用。+1:运行前将数据库图表脚本化为脚本/文本文件似乎达到了某种文件限制,并给出了“docfile已损坏”。像您这样使用跨数据库
    insert
    直接复制它似乎在100%的时间内都能正常工作。当我有时间时,我会看看它是否只是行长度限制。即使使用Azure SQL,仍然非常有帮助。谢谢!打开图表时出错:“docfile已被刷新。“这就是解决方案,对我来说效果很好。。。非常感谢你!
    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
    
    --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;