Sql Server XQuery在select子句中转换xml

时间:2011-03-02 07:30:28

标签: sql-server xml tsql xquery

是否有某种方法可以在Sql Server查询的select子句中从XML列转换/投影XML?

让我们说我们有一个表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> 

我对如何在我的应用程序的内存中完成这项工作不感兴趣,我想在sql查询的select子句中进行服务器端转换。

1 个答案:

答案 0 :(得分:5)

准确生成所需的输出,但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')