declare @T table(XMLCol xml)
insert into @T values
('<image>
<FileName>Tim+bottom</FileName>
<FilePath>/Top+Bottom/AFX8995+450.jpg</FilePath>
</image>')
update T set
XMLCol.modify('replace value of (/image/FilePath[1]/text())[1]
with sql:column("T2.FilePath")')
from @T as T
cross apply (select replace(XMLCol.value('(/image/FilePath)[1]',
'varchar(100)'),
'+',
'_')
) as T2(FilePath)
Редактировать
Переменная таблицы @T
выше вместо вашей таблицы. Предположим, что ваша таблица называется YourTable
, и у вас есть один ID
столбец и XMLCol
столбец. Оператор обновления может выглядеть так, чтобы изменить XML, где ID
равно 1.
update T set
XMLCol.modify('replace value of (/image/FilePath[1]/text())[1]
with sql:column("T2.FilePath")')
from YourTable as T
cross apply (select replace(XMLCol.value('(/image/FilePath)[1]',
'varchar(100)'),
'+',
'_')
) as T2(FilePath)
where T.ID = 1
Редактировать
Невозможно обновить более одного узла одновременно с .modify()
. Вы должны сделать это в цикле. Скрипт ниже использует @T
в качестве тестовой таблицы. Вы должны заменить это именем вашей таблицы. @T
имеет столбец ID
, и сценарий предполагает, что вы обновляете только одну строку за раз, и что вы знаете идентификатор этой строки. В коде есть несколько комментариев, объясняющих, что я делаю. Не стесняйтесь спрашивать, есть ли что-то, что я должен прояснить.
-- Test table
declare @T table(ID int, XMLCol xml)
-- Sample data
insert into @T values
(1,
'<mediadata>
<image>
<FileName>BUF2011-450</FileName>
<FilePath>1/uploadedImages/Products/Indoor_Fun/Puzzles___Brain_Teasers/Puzzles/2000+_Pieces/BUF2011-450.jpg</FilePath>
<Thumbnails>
<Thumbnail>
<FileName>BUF2011-450</FileName>
<FilePath>2/uploadedImages/Products/Indoor_Fun/Puzzles___Brain_Teasers/Puzzles/2000+_Pieces/thumb_BUF2011-450_Large.jpg</FilePath>
</Thumbnail>
<Thumbnail>
<FileName>BUF2011-450</FileName>
<FilePath>3/uploadedImages/Products/Indoor_Fun/Puzzles___Brain_Teasers/Puzzles/2000+_Pieces/thumb_BUF2011-450_Small.jpg</FilePath>
</Thumbnail>
</Thumbnails>
</image>
</mediadata>
')
-- ID for the row you need to update
declare @ID int
set @ID = 1
-- Loop variable, node to update
declare @Pos int
set @Pos = 1
-- The number of nodes to update
declare @Count int
-- Get the number of FilePath nodes
select @Count = XMLCol.query('count(//FilePath)').value('.', 'int')
from @T
where ID = @ID
while @Pos <= @Count
begin
update T set
XMLCol.modify('replace value of ((//FilePath)[sql:variable("@Pos")]/text())[1]
with sql:column("T2.FilePath")')
from @T as T
cross apply (select replace(T.XMLCol.
query('(//FilePath)[sql:variable("@Pos")]').
value('.', 'varchar(100)'),
'+',
'_')
) as T2(FilePath)
where T.ID = @ID
set @Pos += 1
end