XML XPath - 子路径

时间:2014-01-23 22:49:36

标签: sql-server xml xpath

使用以下XML,在SQL Server中如何获取LineItemId,PetId(值),vetid(Value)表?我很难过。

基本上,它应该返回:

255fa32c-dce6-4e7a-83a5-4b45f22f00fc   75866   12916
183dc279-53a6-45fc-9e75-57770582b6bc   34535   34546

从这个XML:

<PurchaseOrder>
  <OrderForms>
    <OrderForm>
      <LineItems>
        <LineItem LineItemId="255fa32c-dce6-4e7a-83a5-4b45f22f00fc">
          <WeaklyTypedProperties>
            <WeaklyTypedProperty Name="petId" Value="75866" Type="String" />
            <WeaklyTypedProperty Name="vetId" Value="12916" Type="String" />
          </WeaklyTypedProperties>
        </LineItem>
        <LineItem LineItemId="183dc279-53a6-45fc-9e75-57770582b6bc">
          <WeaklyTypedProperties>
            <WeaklyTypedProperty Name="petId" Value="345345" Type="String" />
            <WeaklyTypedProperty Name="vetId" Value="345346" Type="String" />
          </WeaklyTypedProperties>
        </LineItem>
      </LineItems>
    </OrderForm>
  </OrderForms>
</PurchaseOrder>

我应该声明我已经尝试了以下内容,但它为petId和vetId提供了空白:

SELECT 
   p.value('@LineItemId','NVARCHAR(100)')
  ,p.query('//PurchaseOrder/OrderForms/OrderForm[1]/LineItems/LineItem[1]/WeaklyTypedProperties/WeaklyTypedProperty[Name="petId"]')
  ,p.query('//PurchaseOrder/OrderForms/OrderForm[1]/LineItems/LineItem[1]/WeaklyTypedProperties/WeaklyTypedProperty[Name="vetid"]')
FROM 
  dbo.[PurchaseOrdersMarshalledData] pomd 
  CROSS APPLY pomd.[MarshalledData].nodes('//PurchaseOrder/OrderForms/OrderForm[1]/LineItems/LineItem') x(p)

谢谢!

2 个答案:

答案 0 :(得分:0)

没有尝试过......也许语法不是100%正确......

<xsl:for-each select="/PurcharseOrder/OrderForms/OrderForm/LineItems/LineItem"/>
    <xsl:value-of select="@LineItemId"/>
    <xsl:for-each select="WeaklyTypedProperties"/>
        <xsl:value-of select="WeaklyTypedProperty/@Value"/>
    </xsl:for-each>
</xsl:for-each>

答案 1 :(得分:0)

SELECT
    [LineItemId] = l.value('@LineItemId', 'nvarchar(100)'),
    [PetId] = w.value('WeaklyTypedProperty[@Name="petId"][1]/@Value', 'int'),
    [VetId] = w.value('WeaklyTypedProperty[@Name="vetId"][1]/@Value', 'int')
FROM dbo.[PurchaseOrdersMarshalledData] pomp
CROSS APPLY pomp.[MarshalledData].nodes('//PurchaseOrder/OrderForms/OrderForm[1]/LineItems/LineItem') LineItem(l)
CROSS APPLY l.nodes('WeaklyTypedProperties') WeaklyTypedProperty(w)