在 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.NoteXML.modify()]:无法将运算符“=”应用于操作数“xs:unsignedInt”和“xs:string”。
您可以在 XQuery 表达式中将 @nota 属性转换为整数。这是修改后的查询:
UPDATE CF
SET NoteXML.modify('replace value of (/rows/row[@nota=49]/text())[1] with "Deadline Balance"')
WHERE Cd_CF = 'C000001'
或者您可以使用下面的查询将 @nota 显式转换为字符串
UPDATE CF
SET NoteXML.modify('replace value of (/rows/row[@nota = string("49")]/text())[1] with "Deadline Balance"')
WHERE Cd_CF = 'C000001'
看起来有效。
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>