xml - 使用 T-SQL 更新多个 XML 节点

标签 xml tsql xpath

<分区>

Possible Duplicate:
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>

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

例如,我想用“something”这个词替换“test”这个词。

所以我不希望两个子节点最终都包含“某物 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 匹配,并根据函数的结果单独更新每个节点?

最佳答案

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

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

关于xml - 使用 T-SQL 更新多个 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7395942/

相关文章:

java - org.springframework.beans.factory.NoSuchBeanDefinitionException : No bean named 'leadDAO' is defined

c# - TSQL:使用 INSERT INTO SELECT FROM 进行更新

sql - 索引和 NOT 运算符

c# - 将数组传递给 SQL Server 存储过程

xpath - 使用xpath选择另一个元素

xml - 加载不同版本的 IBM JDK XML 库

xml - 解码此 xml 时遇到问题

java - 使用 XPath 时有没有办法避免 Jaxp13XPathExpression 的瓶颈?

xml - XPath 获取类似的节点

xml - 将 XSLT 和 XML 输出到 XML 文件