2011-06-06 59 views
4

我遇到了更新SQL字段時遇到的問題,我所寫的完全適用於帶有文本的xml節點,但是當節點空。更新T-SQL中沒有文本的XML字段

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

此代碼正常工作;

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

然而,這打破了;

​​

感謝您的任何幫助。

回答

6

這個節點(/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 /> 
+0

精闢解釋,謝謝! – wonea 2011-06-07 08:54:34

+0

如何在修改方法內的INSERT語句中使用變量? – Si8 2015-08-27 19:05:33

+0

@ SiKni8看看使用sql:variable(「」) – 2015-08-27 19:53:59

0

我認爲這種方法不適用於空節點。
也coud檢查此THEAD:link

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 
2

我有一種情況,我只是想更新EMPTY節點。

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

沒有(節點())是指無子女,而不是(文字())是指沒有文本內容(但可能有孩子,所以混合,並根據需要適應這些情況下)

+0

非常方便,這節省了執行存在檢查。 – 2013-09-19 11:54:16