sql-server - SQL Server 2012 中 XML 元素的位置
问题描述
Create Table #tmp(ID int IDentity(1,1), XMLData XML)
Insert Into #tmp(XMLData)
Values('<SampleXML>
<Fruit>
<Fruits>Apple</Fruits>
<Fruits>Pineapple</Fruits>
</Fruit>
<Fruit>
<Fruits>Grapes</Fruits>
<Fruits>Melon</Fruits>
</Fruit>
</SampleXML>')
SELECT
ID,
A.x.query('data(.)') as name,
Row_Number() over(order by A.x) as number
FROM #tmp
CROSS APPLY XMLData.nodes('SampleXML/Fruit/Fruits') AS A(x)
这导致以下结果:
ID name number
1 Apple 1
1 Pineapple 2
1 Grapes 3
1 Melon 4
但我确实希望它看起来像这样:
ID name number
1 Apple 1
1 Pineapple 1
1 Grapes 2
1 Melon 2
我想知道“水果”是在哪个“水果”元素中找到的。
解决方案
您可以使用以下 SQL,请注意使用“OVER XML 节点”是一个未记录且不受支持的功能:
DECLARE @MyXML XML
SET @MyXML = '<SampleXML>
<Fruit>
<Fruits>Apple</Fruits>
<Fruits>Pineapple</Fruits>
</Fruit>
<Fruit>
<Fruits>Grapes</Fruits>
<Fruits>Melon</Fruits>
</Fruit>
</SampleXML>'
SELECT
Friuts.col.query('data(.)') as name,
DENSE_RANK() over(order by Friut.col) as number
FROM @MyXML.nodes('SampleXML/Fruit') AS Friut(col)
CROSS APPLY Friut.col.nodes('./Fruits') AS Friuts(col)
推荐阅读
- ssl - WebRtc:无法为传输设置 SSL 角色
- linux - 是否必须使用 Cloud9 iDE 与 AWS 交互?
- c++ - 向量下标超出范围。比较向量的元素
- python - 如何在 python 中使用 GTK3 检查窗口是否存在并可能更新其中的数据?
- python - Python:根据列表不完整序列查找单词/字符串的基础序列
- angular - Angular - 如何在 NgFor 中创建动态模板变量
- java - 连接到Android设备时如何获取WIFI提供商名称
- vaticle-typedb - 无法在 Grakn 中创建 [id] 属性
- cpu-architecture - 内存屏障会阻止分支预测吗?
- json - 尝试通过 jsondecoder 解码 json 时出错