从SQL Server中的XML列创建XML结构

时间:2018-06-07 10:05:21

标签: sql-server xml tsql xsd

我有一张超过100万行的表格。在此表中,我有一个包含大型XML文件(DataType XML)的列。现在我必须生成/找出所有这些XML文件的结构。

XML文件的结构通常是不同的 - 因此它并不总是相同的。是否有可能产生ie。所有这些行的XSD文件,以找出结构或评估xml文件中的标记?

您是否有任何想法/过程来获取所有这些xml文件的结构?

1 个答案:

答案 0 :(得分:0)

不,没有通用的方式,至少没有我知道的...... 想象一下两个看起来相同的XML,但是有一个子元素在另一个中缺少。这可能是相同的架构,或者不是......

使用以下方法,您可以检索一些元数据。将其写入边表并尝试使用GROUP BY查找 XML系列

DECLARE @tbl TABLE(ID INT IDENTITY, ShortDescr VARCHAR(100), YourXML XML);
INSERT INTO @tbl VALUES
 ('root and test', N'<root><test/></root>')
,('root and test and more', N'<root><test/><a /><b /></root>')
,('blah and test', N'<blah><test/></blah>')
,('no root (blah and blub)', N'<blah></blah><blub />')
,('no content', NULL)
;

SELECT t.ID
      ,t.ShortDescr
      ,CASE ISNULL(t.YourXML.value('count(/*)','int'),0)
            WHEN 1 THEN 'HasRoot'
            WHEN 0 THEN 'empty'
            ELSE 'Fragment' END AS XmlFormat
      ,t.YourXML.value('local-name((/*)[1])','nvarchar(max)') AS RootName 
      ,t.YourXML.value('local-name((/*[1]/*)[1])','nvarchar(max)') AS FirstChild
FROM @tbl t;

结果如下:

+----+-------------------------+-----------+----------+------------+
| ID | ShortDescr              | XmlFormat | RootName | FirstChild |
+----+-------------------------+-----------+----------+------------+
| 1  | root and test           | HasRoot   | root     | test       |
+----+-------------------------+-----------+----------+------------+
| 2  | root and test and more  | HasRoot   | root     | test       |
+----+-------------------------+-----------+----------+------------+
| 3  | blah and test           | HasRoot   | blah     | test       |
+----+-------------------------+-----------+----------+------------+
| 4  | no root (blah and blub) | Fragment  | blah     |            |
+----+-------------------------+-----------+----------+------------+
| 5  | no content              | empty     | NULL     | NULL       |
+----+-------------------------+-----------+----------+------------+