如何将SQL Server 2008数据库图导出到另一个数据库?

30
我使用SQL Server 2008中方便的数据库图形工具来创建和管理关系。我已将源数据库导出到目标数据库,但图表并未被转移。
我正在寻找方法仅将一个数据库中的图表导出到另一个数据库...这篇在线KB文章失败了,因为select * from dtproperties不再存在。
6个回答

45

@Ash 我也遇到了同样的问题。这是我们采取的解决方法...

看起来系统图表存储在“sysdiagrams”表中。所以你需要做的第一件事就是确定要复制的图表的diagram_id。运行下面的查询以列出它们。** 注意你需要将“SourceDB”替换为你的数据库名称。

-- List all database diagrams
SELECT * FROM [SourceDB].[dbo].sysdiagrams

您可以使用INSERT命令将一个数据库中的图表复制到另一个数据库中,如下所示。请注意,再次更改“SourceDB”为包含现有图表的数据库的名称,“DestinationDB”为要复制到的数据库的名称。同时,@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

这对我们有用,但似乎相当hacky,特别是因为Diagram完全存储在单个二进制字段“definition”中。

答案来自:
http://www.dotnetspider.com/resources/21180-Copy-or-move-database-digram-from-for.aspx


11

这将生成一个导入字符串

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)) + ',' +
        ' @definition=@def'
    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)) + ',' +
        ' @definition=@def'
    AS ExportQuery
FROM
    [dbo].[sysdiagrams]
WHERE
    [name] = @name

7
在不同服务器之间传输图表时,可以使用此方法。为避免 SQL 管理工具的结果大小限制,在 sql select 语句末尾加上 'for xml auto'。XML 输出限制为 2mb,可设置更大。然后只需从 XML 中剪切 SQL 并在其他服务器上执行(您需要先手动创建至少一个图表)。 - Michal Minich

7

如果你修复了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

瞧,第一次就全部完成了。


5

C Isaze的回答所述,这里有三个简单的步骤:

1- 在想要复制图表的目标服务器中创建相同数量的“虚拟”图表

2- 将目标服务器添加为源服务器上的链接服务器

enter image description here enter image description here enter image description here

3- 在源服务器上运行此脚本

update [LINKEDSERVER].TARGETDB.[dbo].sysdiagrams set [definition]=
    (SELECT [definition] from SOURCEDB.[dbo].sysdiagrams WHERE diagram_id = 1)
    where diagram_id=1 

4
如果数据库位于不同的服务器上,可能会存在权限问题。
要复制 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

3

有一个工具可以将图表导出到文件并重新导入到数据库中,您可以在此处找到:https://github.com/timabell/database-diagram-scm/

您可以通过将其指向原始数据库进行导出,然后将其指向目标数据库进行导入来使用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接