在SQL Server 2012中解析XML数据

时间:2013-03-06 11:05:04

标签: sql-server xml xml-parsing sql-server-2012

我在SQL Server数据库中有一个表tblUserData,它有两列:

tblUSerData(ID BIGINT, UserData XML)

XML结构如下:

<user>
   <name>
      Akshay
   </name>
   <age>
      23
   </age>
</user>

我想编写一个存储过程,以便读取表并返回超过20年的用户记录。 我很困惑如何以高效的方式解析表格中的数据。 提前谢谢。

3 个答案:

答案 0 :(得分:6)

您的查询可以使用exist() Method (xml Data Type)

撰写
select ID
from tblUserData
where UserData.exist('/user[age > 20]') = 1

从SQL Server 2012 SP1,您可以使用Selective XML Indexes (SXI),支持上述查询的索引将如下所示。

create selective xml index sxi_UserData on tblUserData(UserData)
for (
    u = '/user' as xquery 'node()' singleton,
    a = '/user/age' as xquery 'xs:double' singleton
    )

要使用选择性XML索引,您必须使用sp_db_selective_xml_index (Transact-SQL)

启用它

有关详细信息,您可以查看Bob Beauchemin上的一些博客文章。

答案 1 :(得分:2)

假设tblUserData中的每一行只包含一个用户节点,并且该用户可以使用一个年龄节点:

WHERE   UserData.value('user[1]/age[1]', 'int') > 20

<强> Example on SQL Fiddle

答案 2 :(得分:0)

所以我创建了表tblUserData然后我编写了将提取年龄超过20的用户的查询

我使用了提供的xml结构

<user>
  <name>
    Akshay
 </name>
 <age>
    23
 </age>
</user>

创建表tblUserData( ID BIGINT,

UserData xml )

insert into tblUserData values (1, '<user>   <name>      Akshay   </name>   <age>         23   </age> </user>')

insert into tblUserData values (2, '<user>   <name>      Tom   </name>   <age>      26   </age> </user>')

以下是将提取年龄超过20岁的用户的查询

 select node.value('name[1]', 'varchar(255)') as userName, node.value('age[1]','int')      as    age
 from dbo.tblUserData tblu
 CROSS APPLY UserData.nodes('/user') nodes(node)

 where node.value('age[1]', 'int') > 20