簡體   English   中英

在SQL Server 2008 R2中查詢復雜的XML

[英]Query complex XML in SQL Server 2008 R2

我試圖通過SQL Server 2008 R2中的XML進行解析,但是遇到了一些問題。 我正在嘗試解析每個父節點的項目,但似乎無法獲得准確的數據。 XML數據如下:

 <Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Project.xsd" Name="Job">
  <Design>
    <Catalog>
      <Identification>
        <Name>Group1</Name>
      </Identification>
      <FeatureSet ID="IDFS-1" Type="Style">
        <Description>Style1</Description>
      </FeatureSet>
      <Item ID="IDI-1-2730">
        <UserCode>Item1</UserCode>
        <LineItemNumber>1</LineItemNumber>
      </Item>
      <Item ID="IDI-1-1595">
        <UserCode>Item2</UserCode>
        <LineItemNumber>2</LineItemNumber>
      </Item>
    </Catalog>
    <Catalog>
      <Identification>
          <Name>Group2</Name>
      </Identification>
      <FeatureSet ID="IDFS-1" Type="Style">
        <Description>Style2</Description>
      </FeatureSet>
      <Item ID="IDI-1-2730">
        <UserCode>Item3</UserCode>
        <LineItemNumber>1</LineItemNumber>
      </Item>
    </Catalog>
  </Design>
</Project>

到目前為止,這是我所使用的SQL,但似乎沒有用。

select
    x.d.query('./UserCode').value('.','char(40)') as UserCode
    ,x.d.query('./LineItemNumber').value('.','char(40)') as lineitemnumber
    ,i.d.query('./Name').value('.','nvarchar(200)') as [Group]
    ,u.d.query('./Description').value('.','nvarchar(200)') as Style
from 
    @xml.nodes('/Project/Design/Catalog/Item') as x(d)
outer apply 
    @xml.nodes('/Project/Design/Catalog/Identification') as i(d)
outer apply 
    @xml.nodes('/Project/Design/Catalog/FeatureSet') as u(d)

顯然,我正在使用XML數據類型將@xml設置為上述xml數據。

以下是我得到的結果:

UserCode    lineitemnumber  Group   Style
Item1       1               Group1  Style1
Item1       1               Group1  Style2
Item1       1               Group2  Style1
Item1       1               Group2  Style2
Item2       2               Group1  Style1
Item2       2               Group1  Style2
Item2       2               Group2  Style1
Item2       2               Group2  Style2
Item3       1               Group1  Style1
Item3       1               Group1  Style2
Item3       1               Group2  Style1
Item3       1               Group2  Style2

我正在尋找的是:

UserCode    lineitemnumber  Group   Style
Item1       1               Group1  Style1
Item2       2               Group1  Style1
Item3       1               Group2  Style2

每個目錄只有一個標識/描述,也只有一個功能集/描述

select
     x.d.query('./UserCode').value('.','char(40)') as UserCode
    ,x.d.query('./LineItemNumber').value('.','char(40)') as lineitemnumber
    ,x.d.query('../Identification/Name').value('.','nvarchar(200)') as [Group]
    ,x.d.query('../FeatureSet/Description').value('.','nvarchar(200)') as Style
from @xml.nodes('/Project/Design/Catalog/Item') as x(d)

如@Backs所述,父節點查詢的性能可能很差,因此可以通過從父節點到子節點進行交叉應用來避免這種情況,然后可以根據需要引用其中任一部分:

select
    -- these 2 are from the child (Item)
    c.i.value('(UserCode/text())[1]', 'char(40)') as UserCode,
    c.i.value('(LineItemNumber/text())[1]', 'char(40)') as lineitemnumber,

    -- these are from the parent (Catalog)
    d.c.value('(Identification/Name/text())[1]', 'nvarchar(200)') as [Group],
    d.c.value('(FeatureSet/Description/text())[1]', 'nvarchar(200)') as Style
from
    @xml.nodes('/Project/Design/Catalog') d(c) -- the parent node
    cross apply d.c.nodes('Item') c(i) -- the Item nodes under the Catalog parent

與之相比,這有更好的估計計划

暫無
暫無

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

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