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

won*_*nea 4 t-sql sql-server-2008 xquery-sql

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

<filemeta filetype="Video">
  <heading>TEST</heading>
  <description />
</filemeta>
Run Code Online (Sandbox Code Playgroud)

这段代码工作正常;

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

然而这打破了;

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

谢谢你的帮助.

Mik*_*son 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
Run Code Online (Sandbox Code Playgroud)

结果:

filemeta
------------------------------------------------------
<filemeta><description>TEST 1</description></filemeta>
<filemeta><description>TEST 2</description></filemeta>
<filemeta />
Run Code Online (Sandbox Code Playgroud)