我在更新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!"');
感谢您的帮助。
答案 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