我try 使用下面的代码将存在于XML中多个位置的值user_input_attn_obligee_desc替换为值EDWIN CHAND.

BEGIN

DECLARE @d1 XML = '
<root>
  <first>                                                                               
    <var name="user_input_attn_obligee_desc">OBLIGEE ATTORNEY</var> 
  </first> 
  <second>
    <var name="user_input_attn_obligee_desc">saravanan</var> 
  </second>   
  <user_input_attn_obligor_desc>OBLIGOR ATTORNEY</user_input_attn_obligor_desc>                          
</root>
';

DECLARE @d NVARCHAR(MAX) = 'EDWIN CHAND';
DECLARE @element_name NVARCHAR(MAX) = 'user_input_attn_obligee_desc';

DECLARE @counter INT = 1;
DECLARE @nodeCount INT = @d1.value('count(/root//*[(@name=sql:variable("@element_name"))])', 'INT');

WHILE @counter <= @nodeCount
BEGIN
    SET @d1.modify('replace value of (/root//*[(@name=sql:variable("@element_name"))])[sql:variable("@counter")] with sql:variable("@d")');
    SET @counter = @counter + 1;
END;

SELECT @d1;

END

但我得到了这样的错误:

XQuery[Modify()]:‘Replace’的目标最多只能是一个 node ,找到了‘Element(*,xdt:untype)*’

我必须在代码中更改哪些内容才能修复此问题?

推荐答案

请try 以下解决方案.

使用.exist()XQuery方法而不是依赖计数器更好、更安全.

SQL

DECLARE @d1 XML = 
N'<root>
  <first>                                                                               
    <var name="user_input_attn_obligee_desc">OBLIGEE ATTORNEY</var> 
  </first> 
  <second>
    <var name="user_input_attn_obligee_desc">saravanan</var> 
  </second>   
  <user_input_attn_obligor_desc>OBLIGOR ATTORNEY</user_input_attn_obligor_desc>                          
</root>';

DECLARE @d NVARCHAR(MAX) = 'EDWIN CHAND';
DECLARE @element_name NVARCHAR(MAX) = 'user_input_attn_obligee_desc';

WHILE @d1.exist('/root/*/var[@name=sql:variable("@element_name")][text()!=sql:variable("@d")]') = 1
BEGIN
    SET @d1.modify('replace value of 
        (/root/*/var[@name=sql:variable("@element_name")][text()!=sql:variable("@d")]/text())[1] 
        with sql:variable("@d")');
END;

-- test
SELECT @d1;

Output

<root>
  <first>
    <var name="user_input_attn_obligee_desc">EDWIN CHAND</var>
  </first>
  <second>
    <var name="user_input_attn_obligee_desc">EDWIN CHAND</var>
  </second>
  <user_input_attn_obligor_desc>OBLIGOR ATTORNEY</user_input_attn_obligor_desc>
</root>

Sql相关问答推荐

SUM(条件)在Oracle?

我如何计算字母a出现的字符串的次数?

为什么在这种情况下我不能使用LAG函数?

对于多字节字符,SQL Server中的DATALENGTH返回1字节

如何用QuestDB生成蜡烛图?

SQL数据库规范化与数据插入

每个学校 Select N个最新的行,但跳过同一学生的重复行

如何修复初学者 SQL INNER JOIN 查询错误

Postgresql - 如何根据阈值计算累积和

返回给定日期后的第 4 个工作日(不包括公众假期)

SQL 查找 varchar 类型列及其值中多次出现的子字符串

如何使用 Google BigQuery 中的条件根据特定列值连接列的 N 行?

没有调用子查询的嵌套 JOIN语法是什么?

当 2 列具有静态值并且第 3 列使用运算符 IN 时,对 PostgreSQL 和 3 列上的复杂索引的最佳查询

基于字符串的SQL查询

正则表达式忽略特定数据部分的分隔符

当该日期的至少两条记录具有相同的持续时间或至少一条记录的持续时间为 0 时,如何标记该日期的所有记录

如何仅在满足条件时才按顺序在 SQL 中计数?

我现在如何显示重复的汽车? postgresql

在 Athena / Presto 中提取 JSON 对象以获取动态密钥