提问人:Sonal 提问时间:11/6/2023 更新时间:11/7/2023 访问量:28
使用存储过程替换存储在 xml 中的值
Replace value stored in xml using a stored procedure
问:
表中有一个 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 ')
只有第一个供应商编号被修改,第二个保持不变
答:
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
很高兴听到建议的解决方案对您有用。请将其标记为已回答。您只需要将答案标记为正确(绿色复选图像)。单击已解决问题的答案左侧的绿色勾选标记。这会将答案标记为“已接受”。
评论