6

我在更新 SQL 字段时遇到了一个问题,因为我编写的内容对于存在文本的 xml 节点非常有效,但是当节点为空时它会跳闸。

<filemeta filetype="Video">
  <heading>TEST</heading>
  <description />
</filemeta>

此代码工作正常;

UPDATE filemetaDB SET filemeta.modify('replace value of (/filemeta/heading/text())[1] with "TEST"');

但是,这会中断;

UPDATE filemetaDB SET filemeta.modify('replace value of (/filemeta/description/text())[1] with "notworking!"');

谢谢你的帮助。

4

4 回答 4

11

(/filemeta/description/text())[1]XML 中不存在此节点,因此无需替换。您必须改为进行插入。如果您有一个混合了空节点和具有值的节点的场景,您必须运行两个更新语句。

declare @filemetaDB table(filemeta xml)

insert into @filemetaDB values
('<filemeta><description>Not empty</description></filemeta>'), -- Not empty node
('<filemeta><description/></filemeta>'),                       -- Empty node
('<filemeta></filemeta>')                                      -- Missing node

-- Replace value for nodes with value
update @filemetaDB
set filemeta.modify('replace value of (/filemeta/description/text())[1] with "TEST 1"')
where filemeta.exist('/filemeta/description/text()') = 1

-- Add text node for empty nodes
update @filemetaDB
set filemeta.modify('insert text{"TEST 2"} into (/filemeta/description)[1]')
where filemeta.exist('/filemeta/description/text()') = 0

select *
from @filemetaDB

结果:

filemeta
------------------------------------------------------
<filemeta><description>TEST 1</description></filemeta>
<filemeta><description>TEST 2</description></filemeta>
<filemeta />
于 2011-06-07T06:24:15.960 回答
2

我有一个场景,我只想更新 EMPTY 节点。

UPDATE filemetaDB SET filemeta.modify('
    insert text{"Oh, this works!!"}
    into (/filemeta/description[not(node()) and not(text())])[1]
');

not(node()) 表示没有孩子,not(text()) 表示没有文本内容(但是可能有孩子,所以根据需要混合和匹配这些情况)

于 2013-09-16T17:08:53.300 回答
1

您可以在更新之前检查节点是否有数据,例如:

IF EXISTS(
            SELECT  null
            FROM    filemetaDB
            WHERE   cast(filemeta.query('if (/filemeta/description[1]) then "T" else ""') as varchar) = 'T')
    BEGIN
        UPDATE filemetaDB SET filemeta.modify('replace value of (/filemeta/description/text())[1] with "notworking!"');
    END
于 2011-06-06T18:57:58.560 回答
0

我认为这种方法不适用于空节点。
您还可以检查此主题:链接

于 2011-06-06T18:31:12.940 回答