2011-03-30 70 views

回答

3

我不知道在replace value of語句中是否可以使用xml。但你可以做到這一點。

declare @xml xml = ' 
<data> 
    <row> 
    <a>A</a> 
    <a>B</a> 
    <a>C</a> 
    </row> 
</data>' 

declare @Val1 varchar(10) 
declare @Val2 varchar(10) 
declare @Val3 varchar(10) 

select 
    @Val1 = 'Data '+r.value('a[1]', 'varchar(1)'), 
    @Val2 = 'Data '+r.value('a[2]', 'varchar(1)'), 
    @Val3 = 'Data '+r.value('a[3]', 'varchar(1)') 
from @xml.nodes('/data/row') n(r) 

set @xml.modify('replace value of (/data/row/a/text())[1] with (sql:variable("@val1"))') 
set @xml.modify('replace value of (/data/row/a/text())[2] with (sql:variable("@val2"))') 
set @xml.modify('replace value of (/data/row/a/text())[3] with (sql:variable("@val3"))') 

2版

declare @xml xml = ' 
<data> 
    <row> 
    <a>A</a> 
    <a>B</a> 
    <a>C</a> 
    </row> 
    <row> 
    <a>1</a> 
    <a>2</a> 
    <a>3</a> 
    </row> 
</data>' 

;with cte as 
(
    select 
    r.query('.') as Row, 
    row_number() over(order by (select 0)) as rn 
    from @xml.nodes('/data/row') n(r) 
) 
select 
    (select 
    'Data '+a.value('.', 'varchar(1)') 
    from cte as c2 
    cross apply Row.nodes('row/a') as r(a) 
    where c1.rn = c2.rn 
    for xml path('a'), root('row'), type) 
from cte as c1 
group by rn 
for xml path(''), root('data') 
+0

感謝Mikael。我在其他網站上看到了這個解決方案,但它不是動態的。如果我有1000個「行」標籤,每個標籤都帶有1-100個「a」標籤? – Brian 2011-03-30 19:07:16

+0

這是很棒的Mikael。謝謝。 – Brian 2011-04-01 12:03:20

1

我有同樣的問題,但我發現另一種解決辦法,我認爲;)

for $n in /data/row 
return replace value of node $n with concat('Data',$n/text()) 

真誠

0

這裏是另一個less-比理想的方式去實現它。

SET @temp.modify('replace value of (/data/row/node()/text())[1] with concat("Data ", (/data/row/node()/text())[1])') 
SET @temp.modify('replace value of (/data/row/node()/text())[2] with concat("Data ", (/data/row/node()/text())[2])') 
SET @temp.modify('replace value of (/data/row/node()/text())[3] with concat("Data ", (/data/row/node()/text())[3])') 

這種方法的缺點是,你需要爲每個行的孩子單獨的聲明。這隻有在事先知道行節點將有多少個子節點時纔有效。

相關問題