更新 SQL 表中的 Xml 值

Update the Xml value in a SQL table

提问人:Xenex79 提问时间:10/13/2023 最后编辑:Yitzhak KhabinskyXenex79 更新时间:10/13/2023 访问量:54

问:

在SQL中,我没有使用XML列和值的经验。

我需要更新(使用 SQL 查询)

<row note="49"> deadline detail</row> 

阅读:

<row note="49"> Deadline Balance</row>

有多个具有不同 id 的笔记,就我而言,我只需要修改 id 为 49 的笔记。

该列的结构是这样的:

<rows>
   <row nota="2">Contratto depositato [...] :-) </row>
   <row nota="3">
       Gli è stata concessa una dilazione.
       Porre attenzione alle condizioni.
    </row>
    <row nota="49">deadline details</row>
</rows>

我试过这个:

UPDATE CF 
SET NoteXML.modify('replace value of (/rows/row[@nota="49"]/text())[1] with "deadline detail"')
WHERE Cd_CF = 'C000001'

这是我得到的错误:

XQuery [CF.注意XML.modify()]: 运算符无法将“=”应用于操作数“xs:unsignedInt”和“xs:string”。

sql sql-server xml xquery

评论

0赞 siggemannen 10/13/2023
@nota=49可能会更好
0赞 AlwaysLearning 10/13/2023
无法在此处重现错误消息,但是如果要将文本替换为为什么要告诉XML.modify将其替换为?deadline detailsDeadline Balance"deadline detail"
1赞 Yitzhak Khabinsky 10/13/2023
在提出问题时,您需要提供一个最小的可重现示例:(1) DDL 和示例数据填充,即 CREATE 表和 INSERT T-SQL 语句。(2) 需要执行的操作,即逻辑和代码尝试在 T-SQL 中实现它。(3) 期望的输出,基于上面 #1 中的示例数据。(4) 您的 SQL Server 版本 (SELECT @@version;)。

答:

0赞 Yitzhak Khabinsky 10/13/2023 #1

它似乎正在工作。

SQL算法

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, Cd_CF VARCHAR(10), NoteXML XML);
INSERT @tbl (Cd_CF, NoteXML) VALUES
('C000001', N'<rows>
   <row nota="2">Contratto depositato [...] :-) </row>
   <row nota="3">
       Gli è stata concessa una dilazione.
       Porre attenzione alle condizioni.
    </row>
    <row nota="49">deadline details</row>
</rows>');
-- DDL and sample data population, end

DECLARE @replaceWith VARCHAR(30) = 'Deadline Balance';

-- before
SELECT * FROM @tbl;

UPDATE @tbl 
SET NoteXML.modify('replace value of (/rows/row[@nota="49"]/text())[1] with sql:variable("@replaceWith")')
WHERE Cd_CF = 'C000001';

-- after
SELECT * FROM @tbl;

输出

<rows>
  <row nota="2">Contratto depositato [...] :-) </row>
  <row nota="3">
       Gli è stata concessa una dilazione.
       Porre attenzione alle condizioni.
    </row>
  <row nota="49">Deadline Balance</row>
</rows>