【发布时间】:2014-06-06 13:09:58
【问题描述】:
有没有办法使用 SQL 搜索 XML 节点以查看父节点是否有子节点和孙子节点?我正在尝试测试一些 XML 文件,看看是否有任何未知的孩子:
<form>
<ItemType>New Regular</ItemType>
<FirstBuyDate>02/01/2007</FirstBuyDate>
<FirstShipDate>02/05/2007</FirstShipDate>
<ItemBrand>Gillette Blade/Razors</ItemBrand>
<ItemDescription>...</ItemDescription>
<Size>8.00</Size>
<InnerOffInvoice />
<MasterOffInvoice />
<PalletItems>
<ID>908402</ID>
<PalletShipDate>04/03/13</PalletShipDate>
</PalletItems>
<ReviewComments />
</form>
在这个例子中,我知道 PalletItems 有孩子。所以我可以制作表格,相应地插入数据。但是我怎么能确定我已经得到了<form> 的所有孙子孙女呢?如果有像<ItemDescription> 这样的不认识的孩子怎么办 - 我如何找到我不认识的孩子?如何测试所有这些节点以查看 <form> 是否有孙子?
这里的代码告诉我有多少孩子:
SELECT distinct Parent.Items.value('local-name(.)', 'varchar(100)') as 'Item'
FROM dbo.FormResults
CROSS APPLY xmlformfields.nodes('/form/*') as Parent(Items)
你们有没有找到孙辈的建议? 谢谢!
另外作为旁注 - 有谁知道如何让这个 SELECT 语句按照它们在 xml 中出现的顺序排列子项?目前,当代码抓取孩子时,它将以随机顺序显示在列中:
Items
1. FirstBuyDate
2. Size
3. ItemType
4. PalletItems... etc.
我希望它们像这样显示:
Items:
1. ItemType
2. FirstBuyDate
3. FirstShipDate
4. ItemBrand... etc.
---------更新----------
现在我们知道 (/form//*) 将得到子孙,这要感谢 valex
我怎样才能把孩子放在一列,孙子放在下一列?会不会是这样的:
SELECT distinct Parent.Items.value('local-name(.)', 'varchar(100)') as 'Child of Form',
CASE when child.items.value('local-name(.)', 'varchar(100)') IS NULL then NULL ELSE 'Has Child' end as 'Grandchild of Form'
FROM dbo.FormResults
CROSS APPLY xmlformfields.nodes('/form/*') as Parent(Items)
Cross Apply parent.items.nodes('/form//*') as child(items)
【问题讨论】:
标签: sql sql-server xml tsql parent-child