有没有办法从SQL Server 2008,SQL Server Management Studio中的现有数据库创建XML架构?
我有一个包含~50个表的数据库。我想创建一个“漂亮”的图表,显示这些表之间的关系。使用另一个名为SQL Designer(https://code.google.com/p/wwwsqldesigner/)的应用程序将为我提供“漂亮”的图片,但我不知道如何创建所需的XML模式。
我在论坛(和MS)进行了搜索,但找不到我的答案。我可以找到创建数据库的工具,但我正在反过来......我需要一张漂亮的图片,以图表的形式显示数据库。我想如果我能将我的数据库结构变成XML,那么SQL Designer将为我完成剩下的工作。
感谢您的协助。
尼克
答案 0 :(得分:15)
如果您只需要表的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就足够了。
答案 1 :(得分:3)
结合运行INFORMATION_SCHEMA或sysobjects的游标,以下内容可以帮助您:
SELECT * FROM [MyTable] FOR XML AUTO, XMLSCHEMA
我不确定你是否可以简单地将它应用于整个数据库,或者需要哪些后处理工作来组合所有各种表模式,但这是可以使用的。
答案 2 :(得分:2)
试试这个(此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
');
答案 3 :(得分:2)
替换行:
, IIF (ic.object_id IS NOT NULL,1,0)as' @ IsPrimaryKey'
有了这个:
,例如,当ic.object_id不为空时,那么1结束0结束' @ IsPrimaryKey' 对于不允许IIF功能的MS SQL服务器版本。