首页 > 解决方案 > TSQL XML字段-如何使用同一级别的另一个标签的条件更新标签

问题描述

有了这个结构

<users>
  <user>
    <fname>Josef</fname>
    <lname>Brown</lname>
    <email_>jo0@adventure-works.com</email_>
    <gender>Male</gender>
  </user>
  <user>
    <fname>Katie</fname>
    <lname>McAskill-White</lname>
    <email_>katie0@adventure-works.com</email_>
  </user>
</users>


xml.modify('replace value of (/users/user/fname/text()) with "Kat"')

我需要添加 where / 条件以仅更新 fname 文本,当电子邮件文本相等时,可以说 katie0@adventure-works.com。

我能找到的所有示例仅在条件在路径上时才有效,但不在同一级别。

标签: xmltsqlxquery

解决方案


Please try the following.

If needed, you can use SQL Server variables as parameters for the XQuery.

SQL

DECLARE @xml XML = 
N'<users>
  <user>
    <fname>Josef</fname>
    <lname>Brown</lname>
    <email_>jo0@adventure-works.com</email_>
    <gender>Male</gender>
  </user>
  <user>
    <fname>Katie</fname>
    <lname>McAskill-White</lname>
    <email_>katie0@adventure-works.com</email_>
  </user>
</users>';

DECLARE @email VARCHAR(128) = 'katie0@adventure-works.com';

-- SET @xml.modify('replace value of (/users/user[email_="katie0@adventure-works.com"]/fname/text())[1] with "Kat"');
SET @xml.modify('replace value of (/users/user[email_=sql:variable("@email")]/fname/text())[1] with "Kat"');

-- test
SELECT @xml;

Output

<users>
  <user>
    <fname>Josef</fname>
    <lname>Brown</lname>
    <email_>jo0@adventure-works.com</email_>
    <gender>Male</gender>
  </user>
  <user>
    <fname>Kat</fname>
    <lname>McAskill-White</lname>
    <email_>katie0@adventure-works.com</email_>
  </user>
</users>

推荐阅读