【问题标题】:Updating multiple XML nodes using T-SQL [duplicate]使用 T-SQL 更新多个 XML 节点 [重复]
【发布时间】:2011-11-15 19:01:52
【问题描述】:

可能重复:
TSQL 2005, XML DML - Update Two Values at once?

假设我有一个带有 XML 列的数据库表。

对于每一行,XML 的结构相同(或相似),但标签的内容不同。

结构看起来像这样:

<Parent1>
  <Parent2>
    <Child>
       test 1
    </Child>
  </Parent2>
  <Parent2>
    <Child>
       test 2
    </Child>
  </Parent2>
</Parent1>

我想对结构中的每个“子”节点进行一些处理,并用结果更新它们。

例如,我想将单词“test”替换为单词“something”。

所以我不希望两个子节点最终都包含“something 1”。

相反,我希望第一个子节点包含“something 1”,第二个子节点包含“something 2”。

我可以编写以下代码,以一次定位一个单个节点:

DECLARE @replacement NVARCHAR(4000) = 'something 1'
UPDATE MyTable
SET MyXMLField.modify('replace value of (Parent1[1]/Parent2[1]/Child[1]/text())[1] with sql:variable("@replacement")')
WHERE Id = 1

但是是否可以编写一个 T-SQL 语句来处理 多个 节点,由 XPath 匹配,并根据例如函数的结果单独更新每个节点?

【问题讨论】:

    标签: xml tsql xpath


    【解决方案1】:

    你必须循环执行,一次一个节点。

    declare @MyTable table(Id int, MyXMLField xml)
    insert into @MyTable values
    (1, '<Parent1>
           <Parent2>
             <Child>test 1</Child>
           </Parent2>
           <Parent2>
             <Child>test 2</Child>
           </Parent2>
         </Parent1>')
    
    declare @replacement nvarchar(4000) = 'something 1'
    declare @Parent2Count int
    select @Parent2Count = MyXMLField.value('count(/Parent1/Parent2)', 'int')
    from @MyTable
    where Id = 1
    
    declare @Node int
    set @Node = 1
    
    while @Node <= @Parent2Count
    begin
      update @MyTable set
        MyXMLField.modify('replace value of 
                              (/Parent1/Parent2[sql:variable("@Node")]/Child/text())[1] 
                              with sql:variable("@replacement")')
      where Id = 1    
    
      set @Node = @Node + 1
    end
    

    【讨论】:

    • 感谢您提供的代码。虽然我还没有测试它,但我担心你使用 'sql:variable("@Node")' 作为数组索引的'替换'代码。我尝试做类似的事情,但它不允许我使用变量作为索引。那么你确定这会奏效吗?
    • +1 用于解决其他人不敢尝试的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2018-08-24
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    相关资源
    最近更新 更多