我已将许多大型XML文件加载到MSSQL数据库的XML字段/表中。我的表(称为XMLImport)有两列;标识XMLColumn的ID列和第二列用于XML文件。我现在需要从数据中获取某些元素,以便可以将其加载到数据库中的各个位置。我在下面列出了我的XML文件的基本格式。元素,子元素和子元素的数量因文件而异。
<root>
<data1>apples</data1>
<data2>pears</data2>
<data3>coconuts</data3>
<element1>
<data1>white</data1>
<data2>brown</data2>
<data3>green</data3>
<data4>yellow</data4>
<data5>blue</data5>
<subelement1>
<data1>one</data1>
<data2>two</data2>
<data3>three</data3>
<data4>four</data4>
<subsubelement1>
<data1>name1</data1>
<data2>slow</data2>
</subsubelement1>
<subsubelement2>
<data1>name2</data1>
<data2>fast</data2>
</subsubelement2>
</subelement1>
<subelement2>
<data1>five</data1>
<data2>six</data2>
<data3>seven</data3>
<data4>eight</data4>
<subsubelement1>
<data1>name3</data1>
<data2>fast</data2>
</subsubelement1>
</subelement2>
</element1>
<element2>
<data1>red</data1>
<data2>pink</data2>
<data3>purple</data3>
<data4>black</data4>
<subelement1>
<data1>nine</data1>
<data2>ten</data2>
<data3>eleven</data3>
<data4>twelve</data4>
</subelement1>
<subelement2>
<data1>thirteen</data1>
<data2>fourteen</data2>
<data3>fifteen</data3>
<data4>sixteen</data4>
<subsubelement1>
<data1>name1</data1>
<data2>fast</data2>
</subsubelement1>
</subelement2>
</element2>
<element3>
<data1>text</data1>
<data2>text</data2>
<data3>text</data3>
<data4>text</data4>
<data5>text</data5>
<subelement1>
<data1>text</data1>
<data2>text</data2>
<data3>text</data3>
<data4>text</data4>
<subsubelement1>
<data1>text</data1>
<data2>text</data2>
</subsubelement1>
</subelement1>
</element3>
</root>
我需要能够像这样生成输出:
apples | pears | white | brown | two | name1 | slow
apples | pears | white | brown | two | name2 | fast
apples | pears | white | brown | six | name3 | fast
apples | pears | red | pink | ten | name1 | fast
etc.
我需要从子元素级别获取数据,而不管一个子元素下有多少个子元素。然后我需要继续下一个子元素并做同样的事情。然后转到数据中的下一个元素并重复。这是我当前的查询。
USE MyDatabase
GO
SELECT XMLColumn.value('(/root/data1)[1]','varchar(150)') AS FirstColumn,
XMLColumn.value('(/root/data2)[1]','varchar(150)') AS SecondColumn,
XMLColumn.value('(/root/element1/data1)[1]','varchar(150)') AS ThirdColumn,
XMLColumn.value('(/root/element1/data2)[1]','varchar(150)') AS FourthColumn,
XMLColumn.value('(/root/element1/subelement1/data2)[1]','varchar(150)') AS FifthColumn,
XMLColumn.value('(/root/element1/subelement1/subsubelement1/data1)[1]','varchar(150)') AS SixthColumn,
XMLColumn.value('(/root/element1/subelement1/subsubelement1/data2)[1]','varchar(150)') AS SeventhColumn
FROM dbo.XMLImport
如果我将[1]更改为另一个数字,我可以获得该级别的下一个值,但我不能得到多个。我有办法循环浏览这些数据吗?任何帮助表示赞赏。谢谢。
答案 0 :(得分:0)
你可能会尝试这样的事情,但是 - 说实话 - 我不知道你想如何把这个并排放在 ......
DECLARE @xml XML=
'<root>
<data1>apples</data1>
<data2>pears</data2>
<data3>coconuts</data3>
<element1>
<data1>white</data1>
<data2>brown</data2>
<data3>green</data3>
<data4>yellow</data4>
<data5>blue</data5>
<subelement1>
<data1>one</data1>
<data2>two</data2>
<data3>three</data3>
<data4>four</data4>
<subsubelement1>
<data1>name1</data1>
<data2>slow</data2>
</subsubelement1>
<subsubelement2>
<data1>name2</data1>
<data2>fast</data2>
</subsubelement2>
</subelement1>
<subelement2>
<data1>five</data1>
<data2>six</data2>
<data3>seven</data3>
<data4>eight</data4>
<subsubelement1>
<data1>name3</data1>
<data2>fast</data2>
</subsubelement1>
</subelement2>
</element1>
<element2>
<data1>red</data1>
<data2>pink</data2>
<data3>purple</data3>
<data4>black</data4>
<subelement1>
<data1>nine</data1>
<data2>ten</data2>
<data3>eleven</data3>
<data4>twelve</data4>
</subelement1>
<subelement2>
<data1>thirteen</data1>
<data2>fourteen</data2>
<data3>fifteen</data3>
<data4>sixteen</data4>
<subsubelement1>
<data1>name1</data1>
<data2>fast</data2>
</subsubelement1>
</subelement2>
</element2>
<element3>
<data1>text</data1>
<data2>text</data2>
<data3>text</data3>
<data4>text</data4>
<data5>text</data5>
<subelement1>
<data1>text</data1>
<data2>text</data2>
<data3>text</data3>
<data4>text</data4>
<subsubelement1>
<data1>text</data1>
<data2>text</data2>
</subsubelement1>
</subelement1>
</element3>
</root>';
- 查询
SELECT lvl1.value('(./text())[1]','nvarchar(max)') AS NodeValue1
,lvl2.value('(./text())[1]','nvarchar(max)') AS NodeValue2
,lvl3.value('(./text())[1]','nvarchar(max)') AS NodeValue3
,lvl4.value('(./text())[1]','nvarchar(max)') AS NodeValue4
FROM @xml.nodes('/root/*') AS A(lvl1)
OUTER APPLY lvl1.nodes('*') AS B(lvl2)
OUTER APPLY lvl2.nodes('*') AS C(lvl3)
OUTER APPLY lvl3.nodes('*') AS D(lvl4)