你需要做这样的事情:
SELECT
t.ID, -- or whatever you need from the table where the XML is located
tbl.People.query('AdditionalInfoList')
FROM
dbo.YourTable t
CROSS APPLY
t.(xmlcolumn).nodes('/People') AS Tbl(People)
WHERE
tbl.People.value('(Item[@Name="Info"]/@Value)[1]', 'varchar(50)') LIKE '%Software Development%'
OR
tbl.People.value('(Item[@Name="Title"]/@Value)[1]', 'varchar(50)') LIKE '%Software Engineer%'
这应该给你所有你感兴趣的条目
说明:
的CROSS APPLY
创建一个“虚拟”表,你需要给一个名字 - 在这里:Tbl(People)
。那个名字并不重要,并且不区分大小写,所以Tbl
和tbl
是相同的。
如果你想GUID从<AdditionalInfoList>
类型为不同的值,你需要在这里使用此查询:
SELECT
t.ID,
--tbl.People.value('(Item[@Name="Info"]/@Value)[1]', 'varchar(50)') AS 'Info',
--tbl.People.value('(Item[@Name="Title"]/@Value)[1]', 'varchar(50)') AS 'Title'
Adtl.Info.value('(@Guid)[1]', 'varchar(50)') AS 'GUID',
Adtl.Info.value('(@type)[1]', 'varchar(50)') AS 'Type'
FROM
@table t
CROSS APPLY
t.xmlcolumn.nodes('/People') AS Tbl(People)
CROSS APPLY
Tbl.People.nodes('AdditionalInfoList/AdditionalInfoListItem') AS Adtl(Info)
WHERE
Tbl.People.value('(Item[@Name="Info"]/@Value)[1]', 'varchar(50)') LIKE '%Software Development%'
OR
Tbl.People.value('(Item[@Name="Title"]/@Value)[1]', 'varchar(50)') LIKE '%Software Engineer%'
你基本上已经做了第二次CROSS APPLY(那会伤害你的表现!)从Tbl.Person
获得每个条目的“附加信息”列表,并从中提取Guid和类型值。
查看SQL Server 2005 XQuery and XML DML的介绍 - 关于在文章中间,有关于如何使用.nodes()
函数的章节。很有帮助!
我目前的解决方案是将所有XML读取到一个XML字符串中,然后解析XML字符串,我认为效率较低。我想找到更有效的解决方案。 – George2 2010-07-14 08:51:36