我一直在寻找从包含xml列的表[Group]中选择父子关系的解决方案。
[组]表具有以下结构:
- ID-int
- 内容-xml
Content 列中存在xml数据-父子关系
<root>
<person name="John">
<device name="notebook" />
<device name="xbox" />
</person>
<person name="Jane">
<device name="TV" />
</person>
<person name="Mark">
</person>
</root>
我想选择以下格式的数据:
组Id | PersonName | DeviceName|
---|---|---|
1 | John笔记本 | |
1 | John | xbox |
1 | Jane | 电视
正如我所提到的,您可以使用XQuery来实现这一点。由于您不希望Mark有任何行,所以我直接转到nodes
方法中的device
节点,因为这意味着找不到Mark的行。然后你可以回到一个级别来获取此人的姓名:
SELECT V.ID AS GroupID,
p.d.value('../@name','nvarchar(50)') AS PersonName,
p.d.value('@name','nvarchar(50)') AS DeviceName
FROM(VALUES(1,CONVERT(xml,'<root>
<person name="John">
<device name="notebook" />
<device name="xbox" />
</person>
<person name="Jane">
<device name="TV" />
</person>
<person name="Mark">
</person>
</root>')))V(ID, Content)
CROSS APPLY V.Content.nodes('root/person/device') p(d);