2011-12-07 52 views
0

所以我有一個腳本來更新/插入以下節點的XML值設置爲True:更新XML在SQL Server 2005瓦特/輸出節點會導致空錯誤

<Submitted>False</Submitted> 

這個問題是不是所有的行會包含該節點,因此,它會引發錯誤:「@temp'上的Mutator'modify()'無法在空值上調用。」

我需要做些什麼來濾除XML中不包含「已提交」節點的行?

**請注意,我有所有這些瘋狂的CASTS,因爲列類型是TEXT,不能更改,因爲客戶端最初設置它的方式。

DECLARE @temp XML 

SELECT 
    @temp = CAST(CAST(TicorOregon..tbl_Module_RequestForms_Items.XML AS NTEXT) AS XML) 
FROM 
    TicorOregon..tbl_Module_RequestForms_Items 
WHERE 
CAST(CAST(TicorOregon..tbl_Module_RequestForms_Items.XML AS NTEXT) AS XML).value('(//Record/Submitted)[1]', 'NVARCHAR(max)') <> 'True' 

-- modification to local XML var 
SET 
    @temp.modify('replace value of (//Record/Submitted[1]/text())[1] with "True"') 

-- write it back into the table as TEXT column  
UPDATE 
    TicorOregon..tbl_Module_RequestForms_Items 
SET 
    XML = CAST(CAST(@temp AS VARCHAR(MAX)) AS TEXT) 
WHERE 
CAST(CAST(TicorOregon..tbl_Module_RequestForms_Items.XML AS NTEXT) AS XML).value('(//Record/Submitted)[1]', 'NVARCHAR(max)') <> 'True' 
AND CAST(CAST(TicorOregon..tbl_Module_RequestForms_Items.XML AS NTEXT) AS XML).value('(//Record/Submitted)[1]', 'NVARCHAR(max)') <> null 
+0

謝謝。這是我能做的最好的事情,這個該死的專欄是TEXT和數據XML,沒有辦法改變列類型,這要歸功於設置這個的客戶。 –

+0

認爲我需要添加一個IF EXISTS語句,現在正在處理這個 –

回答

1

在嘗試更新之前測試您的XML變量爲null。

if @temp is not null 
begin 
    -- modification to local XML var 
    SET @temp.modify ---- 

    -- write it back into the table as TEXT column 
    SET @temp.modify.... 
end 

注:如果存在具有<Submitted>False</Submitted>多個行你可能有與此代碼的麻煩。您將在@temp(可能是根據某個索引的最後一個)中有一行的XML,但是您將更新全部行,其中<Submitted>False</Submitted>與該XML一起使用。

+0

正是我需要的。你是達曼! –

+0

你可以請我這個:http://stackoverflow.com/questions/32974700/why-do-i-receive-a-mutator-error-when-modifying-an-xml-value-in-sql – Si8