繁体   English   中英

T-SQL查询替换XML数据类型列的一个xml节点值中的符号或字符?

[英]T-SQL Query to replace a symbol or character in one xml node value of XML data type column?

我想在特定表的一个 xml 节点中用下划线替换加号。 示例:在下面的输入中,我只想在文件路径节点而不是文件名节点中替换加号。 表列数据类型为 XML 而不是 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>
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列。 更新语句可能如下所示以更改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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM