2016-07-25 7 views
0

で直接XML列を更新する方法:私は1週間でそれぞれの値を増やすことで、属性lastweekran_startlastweekran_endを更新する必要がSQL - 私は次の値が含まれてい<code>XML</code>コラム持つクエリ

<Parameters> 
    <Parameter lastweekran_start="2016-06-04 00:00:00" 
       lastweekran_end="2016-06-10 23:59:59" /> 
</Parameters> 

を。

新しいXMLを作成せずにこれを行う方法に関する手がかりはありますか?

+0

すべての場合は? OPENXMLはオプションですか?あるいは、Xqueryを通して? –

答えて

2

私は2つの解決策を見つけました。どちらも非常にエレガントではありませんが、機能します。

declare @tbl table(id int, params xml) 
insert @tbl values 
(1,'<Parameters><Parameter lastweekran_start="2016-06-04 00:00:00" lastweekran_end="2016-06-10 23:59:59" /></Parameters>') 
,(2,'<Parameters><Parameter lastweekran_start="2015-06-04 00:00:00" lastweekran_end="2015-06-10 23:59:59" /></Parameters>') 

;with par as (--extract values and add 1 week 
select id, dateadd(week,1,t.v.value('@lastweekran_start','datetime')) lastweekran_start , 
dateadd(week,1,t.v.value('@lastweekran_end','datetime')) lastweekran_end 
from @tbl cross apply params.nodes('Parameters/Parameter') t(v) 
) 
update @tbl --and update using modify with replace value of 
--1. lastweekran_start 
set params.modify('replace value of (Parameters/Parameter/@lastweekran_start)[1] 
    with sql:column("lastweekran_start")') 
--2. lastweekran_end 
--set params.modify('replace value of (Parameters/Parameter/@lastweekran_end)[1] 
--  with sql:column("lastweekran_end")') 
from @tbl t inner join par on t.id=par.id 

--The issue here is that replace value of allows single node at a time 
--So the query must run twice for lastweekran_end 
--Comment 1st set block and uncomment 2nd one 

B T-SQL XML DMLを使用
A))xml値と更新を準備します。

;with par as (
select id, cast(concat('<Parameters><Parameter lastweekran_start="', 
convert(varchar,dateadd(week,1,t.v.value('@lastweekran_start','datetime')),121) ,'" lastweekran_end="', 
convert(varchar,dateadd(week,1,t.v.value('@lastweekran_end','datetime')),121),'" /></Parameters>') as xml) newParams 
from @tbl cross apply params.nodes('Parameters/Parameter') t(v) 
) 
update @tbl 
set params=par.newParams 
from @tbl t inner join par on t.id=par.id 
--it looks ugly but works from a single run 
+0

あなたはそれらの質問に勇敢な魂です。ちょっと創造的であることを賞賛します。 :) –