使用TSQL从XML中提取信息

时间:2013-09-03 09:28:40

标签: sql-server tsql

下面的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,到目前为止,我一直在使用patIndexsubstring的组合来执行此操作。

1 个答案:

答案 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

输出 -

tt

<强>更新

例如,XML没有ROOT节点,因此您只需要正确指定路径:

SELECT t.c.query('.')
FROM @XML.nodes('details') t(c)

查询将节点拆分为行:

tt

之后,对于每一行,您都可以通过XML方法value获取数据:

t.c.value('<path>', '<datatype>')

有关其他信息,请阅读此topic