如何使用T-SQL在1个单节点下获取多个节点

时间:2014-01-16 18:57:19

标签: sql-server tsql ssms

我的xml文件如下所示:

<PackageRuntimeContext xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserToken>
<Id>449694</Id>
  </UserToken>
  <Addresses>
        <Address>
      <LastSeen xsi:nil="true" />
      <UniqueID>9afd29f6-f4fe-4a91-aade-da8a3fcdc358</UniqueID>
      <IsPrimary>true</IsPrimary>
      <Id>0</Id>
      <OrderID>0</OrderID>
      <SubjectId>0</SubjectId>
      <AddressLine1>123 Main St.</AddressLine1>
      <City>louisville</City>
      <State>KY</State>
      <ZipCode>40206</ZipCode>
    </Address>
    <Address>
      <LastSeen xsi:nil="true" />
      <UniqueID>0ae8014e-a950-48f3-8ee6-3526a7f3a50d</UniqueID>
      <IsPrimary>true</IsPrimary>
      <Id>0</Id>
      <OrderID>0</OrderID>
      <SubjectId>0</SubjectId>
      <AddressLine1>789 Elm St.</AddressLine1>
      <City>louisville</City>
      <State>KY</State>
      <ZipCode>40206</ZipCode>
    </Address>
    <Address>
      <LastSeen xsi:nil="true" />
      <UniqueID>b1bcc271-bec8-432f-b968-25430ba63b95</UniqueID>
      <IsPrimary>false</IsPrimary>
      <Id>0</Id>
      <OrderID>0</OrderID>
      <SubjectId>0</SubjectId>
      <AddressLine1>456 Oak St.</AddressLine1>
      <City>louisville</City>
      <State>KY</State>
      <ZipCode>40206</ZipCode>
    </Address>
  </Addresses>

我想获得&lt; ID &gt;编号449694,以及随后的3(或其他)&lt; UniqueID &gt; 地址/地址下的数字,所以它看起来像这样:

IDNumber      UniqueID
========      ========
449694         9afd29f6-f4fe-4a91-aade-da8a3fcdc358
449694         0ae8014e-a950-48f3-8ee6-3526a7f3a50d
449694         b1bcc271-bec8-432f-b968-25430ba63b95

代码如果在这里找到(How to query values from xml nodes?),则指示我写这样的东西:

SELECT 
t.p.value('(./UserToken/Id)[1]', 'int') [IdNumber],
t.p.value('(./Addresses/Address/UniqueID)[1]', 'varchar(max)') [Context]
FROM product.PackageRuntimeState prs WITH(NOLOCK)
CROSS APPLY prs.Context.nodes('/PackageRuntimeContext') t(p)

我的结果是:

IDNumber      UniqueID
========      ========
449694        9afd29f6-f4fe-4a91-aade-da8a3fcdc358
449694        b8439471-d4b9-46db-9321-b6175e1b8fb4  (this is from ANOTHER record)
449694        b8439471-d4b9-46db-9321-b6175e1b8fb4  (this too is from another record)

我需要对我的代码做什么才能从我的xml文件中获取后续的UniqueID节点?

谢谢!

1 个答案:

答案 0 :(得分:1)

再降下一级。您需要列出<Addresses>的直接后代,而不是<PackageRuntimeContext>

SELECT
  t.p.value('(../../UserToken/Id)[1]', 'int') [IdNumber],
  t.p.value('(./UniqueID)[1]', 'varchar(max)') [Context]
FROM product.PackageRuntimeState prs WITH(NOLOCK)
CROSS APPLY prs.Context.nodes('/PackageRuntimeContext/Addresses/Address') t(p)