SQL Server XQuery преобразовать XML в предложении выбора - PullRequest
1 голос
/ 02 марта 2011

Есть ли способ преобразовать / спроектировать XML из столбца XML в предложении select запроса Sql Server?

Допустим, у нас есть таблица с Id: Guid, Data: XML.

И скажем, у нас есть следующие данные в столбце «Данные»:

<Order>
  <Details>
     <Detail>
         <Quantity>10</Quantity>
         <ItemPrice>20</Quantity>
     </Detail>
     <Detail>
         <Quantity>10</Quantity>
         <ItemPrice>20</Quantity>
     </Detail>
  </Details>
</Order> 

есть ли способ проецировать это (используя select + xquery), скажем, например:

<Order>
  <Details>
     <Detail>
         <LineTotal>200</LineTotal>
     </Detail>
     <Detail>
         <LineTotal>200</LineTotal>
     </Detail>
  </Details>
</Order> 

Меня не интересует, как это можно сделать в памяти моего приложения, я хочу преобразование на стороне сервера в предложении select в запросе sql.

1 Ответ

5 голосов
/ 02 марта 2011

Выводит именно тот результат, который вы хотите, но SQL Server XML довольно ограничен.В этом примере вам действительно нужно точно знать, как (повторно) создать все дерево - с помощью варианта «кодировано вручную».

declare @tbl table (id uniqueidentifier, data xml)
insert @tbl select newid(), '
<Order>
  <Details>
     <Detail>
         <Quantity>10</Quantity>
         <ItemPrice>20</ItemPrice>
     </Detail>
     <Detail>
         <Quantity>10</Quantity>
         <ItemPrice>20</ItemPrice>
     </Detail>
  </Details>
</Order>'

select ((
    select d.d.value('(Quantity)[1]','int') * d.d.value('(ItemPrice)[1]','int') [LineTotal]
    from ds.ds.nodes('Detail') d(d)
    for xml path('Detail'), type)) Details
from @tbl t
cross apply data.nodes('Order/Details') ds(ds)
for xml path('Order')
...