我有一个包含以下数据的xml列:
<Policy>
<Name>
<Id>adf</Id>
<First>Alan</First>
<Last>Turing</Last>
</Name>
<Name>
<Id>asdf</Id>
<Business>Vandelay Industries</Business>
</Name>
<Name>
<Id>asdf</Id>
<First>Dennis</First>
<Last>Ritchie</Last>
</Name>
</Policy>如何编写XML-DML查询来替换所有行中每个名称的Id元素的值,使其包含First、Last和Business的值。例如:
<Policy>
<Name>
<Id>AlanTuring</Id>
<First>Alan</First>
<Last>Turing</Last>
</Name>
<Name>
<Id>Vandelay Industries</Id>
<Business>Vandelay Industries</Business>
</Name>
<Name>
<Id>DennisRitchie</Id>
<First>Dennis</First>
<Last>Ritchie</Last>
</Name>
</Policy>以下是我失败的尝试:
update policy set data.modify('
replace value of (//Name/Id/text())[1]
with concat(
(//Name/First/text())[1],
(//Name/Last/text())[1],
(//Name/Business/text())[1])') 这会产生以下结果:
<Policy>
<Name>
<Id>AlanTuringVandelay Industries</Id>
<First>Alan</First>
<Last>Turing</Last>
</Name>
<Name>
<Id>asdf</Id>
<Business>Vandelay Industries</Business>
</Name>
<Name>
<Id>asdf</Id>
<First>Dennis</First>
<Last>Ritchie</Last>
</Name>
</Policy>发布于 2012-01-20 23:54:27
这是可行的。
declare @i int
declare @maxNames int
set @i = 1
set @maxNames = (select max(data.value('count(//Name)', 'int')) from Policy)
while @i <= @maxNames begin
update policy set data.modify('
replace value of (//Name[sql:variable("@i")]/Id/text())[1]
with concat(
(//Name[sql:variable("@i")]/First/text())[1],
(//Name[sql:variable("@i")]/Last/text())[1],
(//Name[sql:variable("@i")]/Business/text())[1])
')
set @i = @i + 1
end发布于 2015-11-24 06:43:09
基于集合的选项如下所示:
update policy
set data.modify('
replace value of (//Name[sql:column("id")]/Id/text())[1]
with concat(
(//Name[sql:column("id")]/First/text())[1],
(//Name[sql:column("id")]/Last/text())[1],
(//Name[sql:column("id")]/Business/text())[1])
') https://stackoverflow.com/questions/8943553
复制相似问题