TSQL XML 字段 - 如何使用同一级别的另一个标签的条件更新标签
TSQL XML Field - How to update tag with a condition of another tag at the same level
有了这个结构
<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.
我能找到的所有示例仅在条件在路径上但不在同一级别时才有效。
请尝试以下操作。
如果需要,您可以使用 SQL 服务器变量作为 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;
输出
<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>
有了这个结构
<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.
我能找到的所有示例仅在条件在路径上但不在同一级别时才有效。
请尝试以下操作。
如果需要,您可以使用 SQL 服务器变量作为 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;
输出
<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>