2014-01-23 2 views
1

Используя следующий XML, в SQL Server, как я могу получить таблицу LineItemId, PetId (значение), vetid (Value)? Я в тупике.XML XPath - Sub path

В принципе, это должно вернуться:

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) 

Спасибо!

+0

Возможно, вам не хватает @ для имени, данного это атрибут? – dbermudez

+0

Я не знаю SQL Server, но простой XPath 2.0 может быть что-то вроде '// LineItem/concat (@LineItemId, '', string-join (.// WeaklyTypedProperty/@ Value, ''))' – acdcjunior

ответ

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) 
+0

Вы качаете. Именно то, что мне нужно. – user3229881

0

Не пробовал ... может быть, syntaxis не 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> 
+0

Can not вы сокращаете '// BuyarOrder/OrderForms/OrderForm/LineItems/LineItem' в' // LineItem'? – Robin

+0

Я думал, что вы хотите XSLT, не прочитали часть SQL-Server. Я оставляю шаблон XSLT на всякий случай, если это даст вам некоторый намек! – dbermudez

+0

Я думаю, что более прав для доступа к корневому узлу, на всякий случай, если у вас есть узлы LineItem в других частях документа XML (и вы не хотите их обрабатывать) – dbermudez