2013-05-14 4 views
0

Я в XML как следующееизвлечения данных из XML с помощью SQL

Declare @BathData XML 
SET @BathData='<Batch> 
<Customers> 
<Customer> 
    <CustomerId>1</CustomerId> 
    <Product> 
     <ProductId>10</ProductId> 
     <ProductId>11</ProductId> 
    </Product> 
</Customer> 
<Customer> 
     <CustomerId>2</CustomerId> 
     <Product> 
      <ProductId>22</ProductId> 
      <ProductId>23</ProductId> 
      <ProductId>25</ProductId> 
     </Product> 
</Customer> 

</Customers> 
</Batch>' 

Результат я хочу это следующим образом

CusomerId ProductId 
1   10 
1   11 
2   20 
2   23 
2   35 

и я использую следующий способ разобраться

SELECT Finaldata.R.value('CustomerId[1]','int')    
CustomerId,Finaldata.R.value('Product[1]','int') as ProductId 
FROM @BathData.nodes('//Batch/Customers/Customer') as Finaldata (R) 

, но, очевидно, его не работает быстрый ответ действительно поможет спасибо

ответ

0

Идите по продуктам. Вы можете получить клиент от двух уровней до (../../CustomerId):

SELECT Finaldata.R.value('(../../CustomerId)[1]','int') as CustomerId 
,  Finaldata.R.value('(.)[1]','int') as ProductId 
FROM @BathData.nodes('/Batch/Customers/Customer/Product/ProductId') 
      as Finaldata (R) 

Dot . работ в качестве ссылки на текущий узел.

Смежные вопросы