2010-07-14 213 views
0

我正在使用SQL Server 2008 Enterprise + VSTS 2008 + C#+ .Net 3.5 + ASP.Net + IIS 7.0開發一個簡單的Web應用程序。在我的數據庫表中,我有一個XML類型的列。內容如下,SQL Server 2008 XML查詢問題

如果Title包含「software engineer」或Info包含「Software Development」,我想獲取表中所有行的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> 
+0

我目前的解決方案是將所有XML讀取到一個XML字符串中,然後解析XML字符串,我認爲效率較低。我想找到更有效的解決方案。 – George2 2010-07-14 08:51:36

回答

2

你需要做這樣的事情:

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)。那個名字並不重要,並且不區分大小寫,所以Tbltbl是相同的。

如果你想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()函數的章節。很有幫助!

+0

TBL是什麼?以及如何獲取每個匹配行的檢索信息的GUID和類型? – George2 2010-07-14 09:16:41

+0

對於TBL,我很困惑,因爲您正在使用TBL和「tbl」。 – George2 2010-07-14 09:17:34

+0

謝謝,你是否認爲你的方法比我以前的解決方案快得多,爲什麼? – George2 2010-07-14 09:58:07