在T-SQL中更新没有文本的XML字段

时间:2011-06-06 15:51:46

标签: tsql sql-server-2008 xquery-sql

我在更新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 个答案:

答案 0 :(得分:9)

此节点(/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 />

答案 1 :(得分:2)

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

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

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

答案 2 :(得分: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

答案 3 :(得分:0)

我认为此方法不适用于空节点。
您还可以查看以下内容:link