Вы должны использовать заменить значение (XML DML) .
Синтаксис, используемый для замены значения westbc
на 10
, выглядит следующим образом.
update GDB_ITEMS
set Documentation.modify(
'replace value of (//spdom/bounding/westbc/text())[1] with "10"')
И чтобы получить необходимое вам значение, вы должны использовать что-то вроде этого:
select Documentation.value('(//GeoBndBox/westBL)[1]', 'varchar(20)')
from GDB_ITEMS
Соединение этих двух в одном операторе обновления.
update T
set Documentation.modify(
'replace value of (//spdom/bounding/westbc/text())[1]
with sql:column("S.Value")')
from GDB_ITEMS as T
cross apply (select T.Documentation.value('(//GeoBndBox/westBL)[1]',
'varchar(20)')) as S(Value)
Невозможно заменить значение более чем в одном узле за раз, поэтому вы должны повторить это для каждого узла. Вы можете сделать это довольно хорошо в цикле, используя таблицу карт, которая имеет имя исходного узла и имя целевого узла.
declare @Map table
(
ID int identity primary key,
TargetNode varchar(7),
SourceNode varchar(7)
)
insert into @Map values
('westbc', 'westBL'),
('eastbc', 'eastBL'),
('northbc', 'northBL'),
('southbc', 'southBL')
declare @ID int = 1
while @ID <= 4
begin
update T
set Documentation.modify('replace value of
(//spdom/bounding/*[local-name(.)=sql:column("M.TargetNode")]/text())[1]
with sql:column("S.Value")')
from GDB_ITEMS as T
cross apply (select TargetNode, SourceNode from @Map where ID = @ID) as M
cross apply (select Documentation.value('(//GeoBndBox/*[local-name(.)=sql:column("M.SourceNode")])[1]', 'varchar(20)')) as S(Value)
set @ID += 1
end
Попробуйте здесь: http://data.stackexchange.com/stackoverflow/query/59329/new