使用存储过程替换存储在 xml 中的值

Replace value stored in xml using a stored procedure

提问人:Sonal 提问时间:11/6/2023 更新时间:11/7/2023 访问量:28

问:

表中有一个 xml 数据列 我想使用存储过程替换其中的值

我的XML就像

<Rooms>
<Room Id=798 >
<Supplier Name ="xyz" Number="123">
</Room>
<Room Id=799 >
<Supplier Name ="xyz" Number="123">
</Room>
</Rooms>

我想更换两个房间的供应商编号

房间数量从 2-5 个不等,所以我需要一个循环来运行

我试过了

Update [Table name] Set Data.Modify('将 (//Room/Supplier/@Number)[1] 的值替换为 @newValue ')

只有第一个供应商编号被修改,第二个保持不变

SQL XML 替换

评论

0赞 Yitzhak Khabinsky 11/6/2023
XML 格式不正确。请修复它。
0赞 Yitzhak Khabinsky 11/6/2023
在提出问题时,您需要提供一个最小的可重现示例:(1) DDL 和样本数据填充,即 CREATE 表加上 INSERT T-SQL 语句。(2)你需要做什么,即逻辑和你的代码尝试在T-SQL中实现它。(3) 期望的输出,基于上面 #1 中的示例数据。(4) 您的 SQL Server 版本 (SELECT @@version;)。

答:

0赞 Yitzhak Khabinsky 11/6/2023 #1

我必须修复您的XML以使其格式正确。

以下是如何在MS SQL Server中实现它。

SQL格式

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, xml_data XML);
INSERT @tbl (xml_data) VALUES
(N'<Rooms>
    <Room Id="798">
        <Supplier Name="xyz" Number="123"/>
    </Room>
    <Room Id="799">
        <Supplier Name="xyz" Number="123"/>
    </Room>
</Rooms>');
-- DDL and sample data population, end

DECLARE @new_number VARCHAR(10) = 'fafa';

DECLARE @UPDATE_STATUS BIT = 1;
    
WHILE @UPDATE_STATUS > 0 
BEGIN
    UPDATE t
    SET xml_data.modify('replace value of 
      (/Rooms/Room/Supplier[@Number != sql:variable("@new_number")]/@Number)[1] 
      with sql:variable("@new_number")')
    FROM @tbl AS t
    WHERE xml_data.exist('/Rooms/Room/Supplier[@Number != sql:variable("@new_number")]')=1;
        
    SET @UPDATE_STATUS = @@ROWCOUNT;
    PRINT @UPDATE_STATUS;
END;

-- test
SELECT * FROM @tbl;

输出

<Rooms>
  <Room Id="798">
    <Supplier Name="xyz" Number="fafa" />
  </Room>
  <Room Id="799">
    <Supplier Name="xyz" Number="fafa" />
  </Room>
</Rooms>

评论

0赞 Yitzhak Khabinsky 11/9/2023
很高兴听到建议的解决方案对您有用。请将其标记为已回答。您只需要将答案标记为正确(绿色复选图像)。单击已解决问题的答案左侧的绿色勾选标记。这会将答案标记为“已接受”。