替换SQL Server XML中多处出现的节点值

问题描述 投票:0回答:1

我尝试使用下面的代码将 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()]: 替换的目标最多为一个节点,找到 'element(*,xdt:untyped) *'

我必须在代码中更改什么才能解决此问题?

sql sql-server xml replace xquery-sql
1个回答
0
投票

请尝试以下解决方案。

SQL

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/*/var[@name=sql:variable("@element_name")][text()!=sql:variable("@d")])', 'INT');

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

SELECT @d1;

输出

<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>
© www.soinside.com 2019 - 2024. All rights reserved.