【问题标题】:how to create XML schema from an existing database in SQL Server 2008如何从 SQL Server 2008 中的现有数据库创建 XML 架构
【发布时间】:2021-04-22 18:36:49
【问题描述】:

有没有办法从 SQL Server 2008、SQL Server Management Studio 中的现有数据库创建 XML 架构?

我有一个有大约 50 个表的数据库。我正在寻找一个“漂亮”的图表来显示这些表之间的关系。使用另一个名为 SQL Designer (https://code.google.com/p/wwwsqldesigner/) 的应用程序会给我一个“漂亮”的图片,但我不知道如何创建所需的 XML 模式。

我在论坛(和 MS)上进行了搜索,但找不到我的答案。我可以找到创建数据库的工具,但我正在寻找相反的东西......我需要一张漂亮的图片,以图表的形式显示数据库。我想如果我可以将我的数据库结构转换为 XML,那么 SQL Designer 将为我完成剩下的工作。

感谢您的帮助。

尼克

【问题讨论】:

  • SSMS 内置的图表工具不够用吗?无论如何,您可以查询元数据(sys.tables、sys.indexes、sys.columns)并使用 FOR XML(AUTO) 来获取您需要的表/键/列的 XML 表示。
  • this 有用吗?

标签: sql sql-server-2008


【解决方案1】:

如果您只需要表的 xml 架构,请使用以下方法查询它们:

select top 0 * FROM daTable FOR XML AUTO,XMLSCHEMA

如果您需要表名和列来创建数据库的表示形式以及表的连接方式,您可以使用以下内容:

SELECT
s.name as '@Schema'
,t.name as '@Name'
,t.object_id as '@Id'
,(
    SELECT c.name as '@Name'
    ,c.column_id as '@Id'
    ,IIF(ic.object_id IS NOT NULL,1,0) as '@IsPrimaryKey'
    ,fkc.referenced_object_id as '@ColumnReferencesTableId'
    ,fkc.referenced_column_id as '@ColumnReferencesTableColumnId'
    FROM sys.columns as c
    LEFT OUTER JOIN sys.index_columns as ic
        ON c.object_id = ic.object_id
        AND c.column_id = ic.column_id
        AND ic.index_id = 1
    LEFT OUTER JOIN sys.foreign_key_columns as fkc
        ON c.object_id = fkc.parent_object_id
        AND c.column_id = fkc.parent_column_id
    WHERE c.object_id = t.object_id
    FOR XML PATH ('Column'),TYPE
)
FROM sys.schemas as s
INNER JOIN sys.tables as t
    ON s.schema_id = t.schema_id
FOR XML PATH('Table'),ROOT('Tables')

让您的应用程序使用 ColumnReferencesTableId 和 ColumnReferencesTableColumnId 来获取表关系。如果您更喜欢写出它们的名称,您还可以进一步加入引用的列和表,但我认为它们的 Id 就足够了。

【讨论】:

  • 哇,谢谢大卫。我会试一试,让你知道。另外,感谢您之前的 cmets。根据您提供的链接,我确实相信它是重复的。但是,我认为您在这里的参考资料更丰富。问候,尼克
  • 供大家参考:使用带引号的列名是不推荐使用的语法。如果我今天写这个例子,我会使用括号来代替 [@IsPrimaryKey]
【解决方案2】:

结合通过 INFORMATION_SCHEMA 或 sysobjects 运行的游标,以下内容应该对您有所帮助:

SELECT * FROM [MyTable] FOR XML AUTO, XMLSCHEMA

我不确定您是否可以简单地将其应用于整个数据库,或者将所有不同的表模式组合起来需要哪些后处理工作,但它是可以使用的。

【讨论】:

  • 感谢 Zec 您的意见。在冒险走这条路之前,我将研究其他一些解决方案。感谢您的意见。尼克
  • 没有问题。你的问题的其他答案,特别是大卫的,要好得多。我敢肯定,我以后还会再来这里的。
【解决方案3】:

试试这个(answer 的变体):

DECLARE @listStr VARCHAR(MAX)
SELECT @listStr = COALESCE(@listStr+',' ,'') + TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'

EXEC('
  DECLARE @schema xml
  SET @schema = (SELECT TOP 0 * FROM ' + 
     @listStr + 
     ' FOR XML AUTO, ELEMENTS, XMLSCHEMA(''DbSchema''))
  SELECT @schema
     ');

【讨论】:

  • 谢谢亚历克斯。除了上面大卫的解决方案,我也会试试你的解决方案。我非常感谢您和论坛其他人的支持。亲切的问候,尼克
  • 如何使用或调用上述动态查询?
  • 注意:我的 DB 往往有模式和“有趣”的表名,所以对 SELECT @listStr = COALESCE(@listStr+',' ,'') + '[' + TABLE_SCHEMA + '].['+TABLE_NAME+']' 稍作调整就可以解决这个问题。把它放在这里是为了让其他人注意到“第 3 行的语法错误”作为您来自 SQL 的唯一消息。
【解决方案4】:

换行:

,**IIF**(ic.object_id IS NOT NULL,1,0) as '@IsPrimaryKey'

有了这个:

,CASE WHEN ic.object_id IS NOT NULL THEN 1 ELSE 0 END AS '@IsPrimaryKey'
for MS SQL server versions not allowing the IIF function.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多