更新T-SQL中所有XML标记的值

时间:2015-06-29 16:26:22

标签: sql-server xml tsql

有没有办法在SQL Server中的xml中替换多次出现的标记值?

我需要检查特定标记(FirstName)并将其所有值替换为另一个。

这是我的示例xml:

<Root>
  <Patient>
    <FirstName>Something</FirstName>
    <MiddleInitial>W</MiddleInitial>
    <LastName>West</LastName>
  </Patient>
  <Patient>
    <FirstName>Another</FirstName>
    <MiddleInitial>E</MiddleInitial>
    <LastName>East</LastName>
  </Patient>
</Root>

我想要的输出是:

<Root>
  <Patient>
    <FirstName>TEST</FirstName>
    <MiddleInitial>W</MiddleInitial>
    <LastName>West</LastName>
  </Patient>
  <Patient>
    <FirstName>TEST</FirstName>
    <MiddleInitial>E</MiddleInitial>
    <LastName>East</LastName>
  </Patient>
</Root>

我目前有这个修改语句,它将改变第一次出现,但忽略了下一个&#39; FirstName&#39;出现的标签:

SET @x.modify('
  replace value of
    (/Root/Patient/FirstName[1]/text())[1]
  with "TEST"
');

这给了我这个:

<Root>
  <Patient>
    <FirstName>TEST</FirstName>
    <MiddleInitial>W</MiddleInitial>
    <LastName>West</LastName>
  </Patient>
  <Patient>
    <FirstName>Another</FirstName>
    <MiddleInitial>E</MiddleInitial>
    <LastName>East</LastName>
  </Patient>
</Root>

我尝试将其抛入while循环,在路径存在时执行,但看起来我只是创建了一个无限循环:

WHILE @x.exist('(/Root/Patient/FirstName[1]/text())[1]') = 1

对于解决这个问题的任何想法都将非常感激!

1 个答案:

答案 0 :(得分:1)

我确信有更好的方法,但一种方法是

WHILE @x.exist('(/Root/Patient/FirstName[text() != "TEST"])') = 1
SET @x.modify('
  replace value of
     (/Root/Patient/FirstName[text() != "TEST"][1]/text())[1]
  with "TEST"
');