下面的XML以不寻常的方式塑造。如何在SQL Server中使用XQuery从以下XML中提取所有字段名称和字段值?我特别感兴趣的是使用字段名1006
来提取字段值。
<details>
<fieldname>1006</fieldname>
<fieldvalue>HSBC BANK PLC</fieldvalue>
</details>
<details>
<fieldname>1005</fieldname>
<fieldvalue>POOLE LONGFLEET</fieldvalue>
</details>
<details>
<fieldname>1059</fieldname>
<fieldvalue>165-167 High Street</fieldvalue>
</details>
<details>
<fieldname>1063</fieldname>
<fieldvalue>POOLE</fieldvalue>
</details>
我需要处理相对大量的XML,到目前为止,我一直在使用patIndex
和substring
的组合来执行此操作。
答案 0 :(得分:3)
试试这个 -
DECLARE @XML XML
SELECT @XML = '
<details>
<fieldname>1006</fieldname>
<fieldvalue>HSBC BANK PLC</fieldvalue>
</details>
<details>
<fieldname>1006</fieldname>
<fieldvalue>test2</fieldvalue>
</details>
<details>
<fieldname>1005</fieldname>
<fieldvalue>POOLE LONGFLEET</fieldvalue>
</details>
<details>
<fieldname>1059</fieldname>
<fieldvalue>165-167 High Street</fieldvalue>
</details>
<details>
<fieldname>1063</fieldname>
<fieldvalue>POOLE</fieldvalue>
</details>'
SELECT
fieldname = t.c.value('./fieldname[1]', 'INT')
, fieldvalue = t.c.value('./fieldvalue[1]', 'VARCHAR(100)')
FROM @XML.nodes('details') t(c)
WHERE t.c.value('./fieldname[1]', 'INT') = 1006
输出 -
<强>更新强>
例如,XML
没有ROOT
节点,因此您只需要正确指定路径:
SELECT t.c.query('.')
FROM @XML.nodes('details') t(c)
查询将节点拆分为行:
之后,对于每一行,您都可以通过XML
方法value
获取数据:
t.c.value('<path>', '<datatype>')
有关其他信息,请阅读此topic。