我使用SQL Server 2012和SQL Server 2008 R2。
我在我的数据库中从所有对象(tables / trigger / stored procedure / function ...)创建一个脚本。
我是从SQL Server Management Studio生成此脚本的。我可以在另一台服务器上用这个scrips重新创建我的数据库。但是在运行我的脚本以创建另一个数据库后,我想念我的数据库的所有图表。
因此,我需要从我的数据库中存在的所有图表创建备份脚本。
我需要在目标数据库上执行此脚本以重新创建我的所有图表。
我发现了Link。但我需要一些人认为自动创建所有脚本(插入命令)。
答案 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
语句重建图表时,我收到了错误
因此,虽然看起来有可能在从脚本创建的新数据库中创建图表并不容易。继续给出有关脚本图的答案,并根据自己的需要进行修改。
也许你可以进一步调查并发表你自己的答案:)
答案 2 :(得分:0)
这是一个快速的&amp;我使用的脏方法。由于查询窗口不会显示定义字段的完整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&amp; ctrl-c复制生成的所有行。
将输出粘贴回查询窗口。我通常将它粘贴在一对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;
删除行&amp;来自插入的/ row XML标记,并在目标服务器上运行它们。如果要用新值替换所有值,则可以截断sysdiagrams表。