簡體   English   中英

SQL Server 2008 XML查詢問題

[英]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並不重要,也不區分大小寫,因此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%'

您基本上必須進行第二次“交叉應用”(這會損害您的性能!),以便從Tbl.Person中獲取每個條目的“附加信息”列表,並從中提取Guid和類型值。

查看SQL Server 2005 XQuery和XML DML簡介-在本文的中間,有關如何使用.nodes()函數的部分。 很有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM