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

Ash*_*ine 30 sql-server diagram

我使用SQL Server 2008中的方便的数据库图表工具来创建和管理关系.我已将sourceDB导出到destinationDB,但图表没有出现.

我正在四处寻找如何将我在一个数据库中的图表导出到另一个数据库...这个在线知识库文章 失败,因为select * from dtproperties不再存在.

Jus*_*tin 45

@Ash我遇到了同样的问题.以下是我们为解决这个问题所做的工作......

System Diagrams似乎存储在"sysdiagrams"表中.因此,您需要做的第一件事是确定要复制的Diagram的diagram_id.运行以下查询以列出所有查询.**请注意,您需要将"SourceDB"替换为数据库的名称.

-- List all database diagrams
SELECT * FROM [SourceDB].[dbo].sysdiagrams
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用INSERT将图表从一个数据库复制到另一个数据库,如下所示.**注意再次将"SourceDB"替换为包含现有图表的Database的名称,将"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
Run Code Online (Sandbox Code Playgroud)

然后你需要手动将"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
Run Code Online (Sandbox Code Playgroud)

这对我们有用,看起来非常h​​acky,特别是因为Diagram完全存储在单个二进制字段"定义"中.

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


Edu*_*omo 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
Run Code Online (Sandbox Code Playgroud)

接下来,在其他DB中运行生成的字符串.

作为程序:

-- =============================================
-- 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
Run Code Online (Sandbox Code Playgroud)

  • 这可以在不同服务器之间传输图表时使用.为了避免限制SQL Management studio的结果大小,在sql select结束时添加'for xml auto'.XML输出限制为2mb,可以设置为更多.然后只需从xml中剪切sql并在其他服务器上执行(您需要至少手动创建一个图表) (7认同)

小智 7

你可以UPDATE通过修改你的INSERT陈述 - 特别是选择部分来摆脱陈述.您正在将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
Run Code Online (Sandbox Code Playgroud)

而且,首先,它就在那里.


Zak*_*ria 5

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 
Run Code Online (Sandbox Code Playgroud)