2011-03-02 31 views
1

是否有某种方式到SQL Server查询的SELECT子句中从XML列变换/项目XML?Sql Server的XQuery转换XML在SELECT子句

可以说我们有一个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

你的意思'的''而不是20 ' – RichardTheKiwi 2011-03-02 08:05:12

回答

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')