2014-04-30 33 views
1

我有一个表中的两个XML字段说A和B A有类似的数据:和写入到另一个XML领域的SQL Server

   <periods> 
       <historicalperiod>2</historicalperiod> 
       <historicalperiod>4</historicalperiod> 
       <historicalperiod>6</historicalperiod> 
       <historicalperiod>8</historicalperiod> 
       </periods> 

以上XML可以有可变数量的节点。

我必须在以下格式此数据来场B复制:

   <periods> 
       <historicalperiod1>2</historicalperiod1> 
       <historicalperiod2>4</historicalperiod2> 
       <historicalperiod3>6</historicalperiod3> 
       <historicalperiod4>8</historicalperiod4> 
       </periods> 

我使用临时表

   create table temp 
       (period int) 

       ;with cte as (
       select 
       T.C.value('.', 'nvarchar(max)') as period 
       from BatchQuotaSettings 
       CROSS APPLY HistoryPeriods.nodes('/periods/historicalperiod') as T(C)  
        ) 
       insert into temp (period) 
       select c.period 
        from cte c 

尝试这是没有更好的办法来做到这一点?

回答

1

分解XML并使用row_number枚举分解的节点。将您的新XML节点构建为字符串,转换为XML并使用for xml path组合节点。

update T 
set B = (
     select cast('<historicalperiod'+cast(S.R as varchar(10))+'>'+S.V+'</historicalperiod'+cast(S.R as varchar(10))+'>' as xml) 
     from (
      select P.X.value('text()[1]', 'varchar(10)') as V, 
        row_number() over(order by P.X) as R 
      from T.A.nodes('/periods/historicalperiod') as P(X) 
      ) as S 
     for xml path(''), root('periods'), type 
     ) 
from BatchQuotaSettings as T 

SQL Fiddle

相关问题