我想在特定表的一个xml节点中用下划线替换加号。 示例:在下面的输入中,我想仅在filepath节点和NOT filename节点中替换加号。 表列数据类型是XML和NOT varchar。
输入:
<mediadata>
<image>
<FileName>BUF2011-450</FileName>
<FilePath>/uploadedImages/Products/Indoor_Fun/Puzzles___Brain_Teasers/Puzzles/2000+_Pieces/BUF2011-450.jpg</FilePath>
<Thumbnails>
<Thumbnail>
<FileName>BUF2011-450</FileName>
<FilePath>/uploadedImages/Products/Indoor_Fun/Puzzles___Brain_Teasers/Puzzles/2000+_Pieces/thumb_BUF2011-450_Large.jpg</FilePath>
</Thumbnail>
<Thumbnail>
<FileName>BUF2011-450</FileName>
<FilePath>/uploadedImages/Products/Indoor_Fun/Puzzles___Brain_Teasers/Puzzles/2000+_Pieces/thumb_BUF2011-450_Small.jpg</FilePath>
</Thumbnail>
</Thumbnails>
</image>
</mediadata>
答案 0 :(得分:4)
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
列。 update语句可能如下所示,以更改ID
为1的XML。
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
列,该脚本假定您一次只更新一行,并且您知道该行的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