你需要做這樣的事情:
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