我使用SQL Server 2008中方便的数据库图表工具来创建和管理关系。我已经将sourceDB导出到了目标数据库,但没有遇到图表。如何将SQL Server 2008数据库图导出到另一个数据库?
我环顾四周试图弄清楚如何将我在一个数据库中的图导出到另一个...此online KB article失败,因为select * from dtproperties
不存在了。
我使用SQL Server 2008中方便的数据库图表工具来创建和管理关系。我已经将sourceDB导出到了目标数据库,但没有遇到图表。如何将SQL Server 2008数据库图导出到另一个数据库?
我环顾四周试图弄清楚如何将我在一个数据库中的图导出到另一个...此online KB article失败,因为select * from dtproperties
不存在了。
@Ash我遇到了同样的问题。以下是我们为解决它而做的...
看起来系统图存储在“sysdiagrams”表中。因此,您需要做的第一件事是确定您想要复制的关系图的diagram_id。运行以下查询将其全部列出。 **请注意,您需要将“SourceDB”替换为数据库的名称。
-- List all database diagrams
SELECT * FROM [SourceDB].[dbo].sysdiagrams
然后,您可以使用INSERT将图从一个数据库复制到另一个数据库,如下所示。 **再次用包含现有图表和“DestinationDB”的数据库的名称替换“SourceDB”,并将其替换为要复制到的数据库的名称。还应该将@SourceDiagramId设置为上面检索的ID。
-- Insert a particular database diagram
DECLARE @SourceDiagramId int = 1
INSERT INTO [DestinationDB].[dbo].sysdiagrams
SELECT [name],diagram_id , version,definition from [SourceDB].[dbo].sysdiagrams
WHERE diagram_id = @SourceDiagramId
然后,您需要手动设置“principal_id”为1。
-- Update the principal id (no idea why, but it set the owner as some asp_net user
UPDATE [DestinationDB].[dbo].sysdiagrams
SET principal_id = 1
这个工作对我们来说似乎很哈克尤其是因为图是完全存储在单个二进制领域“定义”。
答案来自:
http://www.dotnetspider.com/resources/21180-Copy-or-move-database-digram-from-for.aspx
您可以通过固定的INSERT
声明摆脱UPDATE
声明 - 特别是选择部分。您将diagram_id
列插入principal_id
列(diagram_id是标识)。
将其更改为:
DECLARE @SourceDiagramId int = 1
INSERT INTO [DestinationDB].[dbo].sysdiagrams
SELECT [name],principal_id,version,definition from [SourceDB].[dbo].sysdiagrams
WHERE diagram_id = @SourceDiagramId
而且似的,这一切都在有正确的第一次。
如果数据库位于不同的服务器中,则可能存在权限问题。
要复制sysdiagrams,创造同样多的,你要复制的图表,添加目标服务器在源服务器链接服务器,然后运行该脚本在目标服务器的“虚拟”图:
SELECT * from [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams
SELECT * from SOURCEDB.[dbo].sysdiagrams
update [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams set definition=
(SELECT definition from SOURCEDB.[dbo].sysdiagrams WHERE diagram_id = 1)
where diagram_id=1
-- the first 2 select commands will confirm that you are able to connect to both databases
-- then change the id as required to copy all the diagrams
这产生进口串:
SELECT
'DECLARE @def AS VARBINARY(MAX) ; ' +
'SELECT @def = CONVERT(VARBINARY(MAX), 0x' + CONVERT(NVARCHAR(MAX), [definition], 2) + ', 2) ;' +
' EXEC dbo.sp_creatediagram' +
' @diagramname=''' + [name] + ''',' +
' @version=' + CAST([version] AS NVARCHAR(MAX)) + ',' +
' @[email protected]'
AS ExportQuery
FROM
[dbo].[sysdiagrams]
WHERE
[name] = '' -- Diagram Name
接下来,你就可以运行其它数据库生成的字符串。
-- =============================================
-- Author: Eduardo Cuomo
-- Description: Export Database Diagrama to SQL Query
-- =============================================
CREATE PROCEDURE [dbo].[Sys_ExportDatabaseDiagram]
@name SYSNAME -- Diagram Name
AS
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
SELECT
'DECLARE @def AS VARBINARY(MAX) ; ' +
'SELECT @def = CONVERT(VARBINARY(MAX), 0x' + CONVERT(NVARCHAR(MAX), [definition], 2) + ', 2) ; ' +
' EXEC dbo.sp_creatediagram' +
' @diagramname=''''' + [name] + ''''',' +
' @version=' + CAST([version] AS NVARCHAR(MAX)) + ',' +
' @[email protected]'
AS ExportQuery
FROM
[dbo].[sysdiagrams]
WHERE
[name] = @name
这可以在不同服务器之间传输图表时使用。为了避免SQL Management Studio对结果大小的限制,在sql select的末尾添加'for xml auto'。 XML输出限制为2MB,可以设置更多。然后,简单地从xml中剪切sql并在其他服务器上执行(至少需要手动创建一个图表) – 2014-10-09 12:04:56
这是完美的hack .. – Halim 2015-03-16 12:55:05
正如C Isaze答案,有三个简单的步骤:
1-创建相同数量的目标服务器的“虚拟”图要复制图
2-添加目标服务器作为源服务器链接服务器
3-运行此脚本源服务器上
update [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams set [definition]=
(SELECT [definition] from SOURCEDB.[dbo].sysdiagrams WHERE diagram_id = 1)
where diagram_id=1
有导出图表到文件,并回,你可以在这里找到一个数据库的工具:https://github.com/timabell/database-diagram-scm/
通过将它指向原始数据库并执行导出,然后指向目标数据库并执行导入,可以使用它。
它工作得很好,对我来说也是如此。谢谢。 – 2016-02-09 15:52:10