2011-03-30 68 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])') 

这种方法的缺点是,你需要为每个行的孩子单独的声明。这只有在事先知道行节点将有多少个子节点时才有效。

相关问题