我在 SQL Server 数据库中有一个表 tblUserData,它有两列:
tblUSerData(ID BIGINT, UserData XML)
XML 结构如下:
<user>
<name>
Akshay
</name>
<age>
23
</age>
</user>
我想编写一个存储过程,以便读取表并返回 20 岁以上用户的记录。我很困惑如何以有效的方式解析数据表。提前致谢。
我在 SQL Server 数据库中有一个表 tblUserData,它有两列:
tblUSerData(ID BIGINT, UserData XML)
XML 结构如下:
<user>
<name>
Akshay
</name>
<age>
23
</age>
</user>
我想编写一个存储过程,以便读取表并返回 20 岁以上用户的记录。我很困惑如何以有效的方式解析数据表。提前致谢。
您的查询可以使用exists() 方法(xml 数据类型)编写
select ID
from tblUserData
where UserData.exist('/user[age > 20]') = 1
从 SQL Server 2012 SP1 开始,您可以使用选择性 XML 索引 (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的一些博客文章。
假设 tblUserData 中的每一行将只包含一个用户节点,并且该用户中的一个年龄节点可以使用:
WHERE UserData.value('user[1]/age[1]', 'int') > 20
所以我创建了表 tblUserData 然后我编写了将提取年龄超过 20 岁的用户的查询
我使用了提供的 xml 结构
<user>
<name>
Akshay
</name>
<age>
23
</age>
</user>
创建表 tblUserData (ID BIGINT,
用户数据 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