[英]SQL Server 2008 XML query issue
我正在使用SQL Server 2008 Enterprise + VSTS 2008 + C#+ .Net 3.5 + ASP.Net + IIS 7.0開發簡單的Web應用程序。 在數據庫表中,我有一個XML類型列。 內容如下
如果標題包含“軟件工程師”或信息包含“軟件開發”,我想獲取表中所有行的AdditionalInfoList。 我的問題是如何有效地編寫這樣的查詢?
<People>
<Item Name="Username" Value="George" />
<Item Name="Info" Value="Software Development Information" />
<Item Name="Title" Value="Software Engineer in Backend" />
<AdditionalInfoList>
<AdditionalInfoListItem Guid="xxx" type="type1" />
<AdditionalInfoListItem Guid="yyy" type="type2" />
</AdditionalInfoList>
</People>
你需要做這樣的事情:
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
和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%'
您基本上必須進行第二次“交叉應用”(這會損害您的性能!),以便從Tbl.Person
中獲取每個條目的“附加信息”列表,並從中提取Guid和類型值。
查看SQL Server 2005 XQuery和XML DML簡介-在本文的中間,有關如何使用.nodes()
函數的部分。 很有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.