Lou*_*ers 2 xml sql t-sql sql-server xpath
我正在使用Microsoft SQL Server。
我有一个简单的层次结构,如Xml中的有向图:
DECLARE @XML as XML = CAST(
'<ROOT>
<NODE NODE_ID="1">
<EDGE>2</EDGE>
<EDGE>3</EDGE>
<EDGE>4</EDGE>
</NODE>
<NODE NODE_ID="2">
<EDGE>1</EDGE>
<EDGE>3</EDGE>
</NODE>
</ROOT>' AS XML);
Run Code Online (Sandbox Code Playgroud)
我想要的输出将是一个像这样的表:
SOURCE_NODE_ID | DEST_NODE_ID
1 | 2
1 | 3
1 | 4
2 | 1
2 | 3
Run Code Online (Sandbox Code Playgroud)
这样的查询:
SELECT B.value('data(@NODE_ID)','int') AS SOURCE_NODE_ID,
A.B.value('(EDGE/text())[1]', 'int') AS DEST_NODE_ID
FROM @XML.nodes('/ROOT/NODE') AS A(B);
Run Code Online (Sandbox Code Playgroud)
只返回第一条边:
SOURCE_NODE_ID | DEST_NODE_ID
1 | 2
2 | 1
Run Code Online (Sandbox Code Playgroud)
这一点做得更好:
SELECT B.value('data(@NODE_ID)','int') AS SOURCE_NODE_ID,
B.query('EDGE').value('.', 'int') AS DEST_NODE_ID
FROM @XML.nodes('/ROOT/NODE') AS A(B);
Run Code Online (Sandbox Code Playgroud)
只有它将所有边连接到一个单元格中:
SOURCE_NODE_ID | DEST_NODE_ID
1 | 234
2 | 13
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到理想的结果?我应该加入内部查询之类的东西吗?可能我把它弄得太复杂了,肯定有一个简单的解决方案吗?
像这样尝试
由于NODE元素很多,因此需要调用.nodes()它们。由于EDGE嵌套了许多元素,因此需要调用CROSS APPLY .nodes()它们。
其余的很容易...
DECLARE @XML as XML = CAST(
'<ROOT>
<NODE NODE_ID="1">
<EDGE>2</EDGE>
<EDGE>3</EDGE>
<EDGE>4</EDGE>
</NODE>
<NODE NODE_ID="2">
<EDGE>1</EDGE>
<EDGE>3</EDGE>
</NODE>
</ROOT>' AS XML);
SELECT Nd.value('@NODE_ID','INT') AS SOURCE_NODE_ID
,Edg.value('.','INT') AS DEST_NODE_ID
FROM @XML.nodes('/ROOT/NODE') AS A(Nd)
CROSS APPLY A.Nd.nodes('EDGE') AS B(Edg)
Run Code Online (Sandbox Code Playgroud)
结果
SOURCE_NODE_ID DEST_NODE_ID
1 2
1 3
1 4
2 1
2 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
423 次 |
| 最近记录: |