更新 SQL 表中的 Xml 值

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

在 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”。

sql sql-server xml xquery
2个回答
0
投票

您可以在 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'

0
投票

看起来有效。

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