0

所以我有一个脚本可以将以下节点的 XML 值更新/插入为 True:

<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
4

1 回答 1

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>. 您将获得其中一行的 XML @temp(根据某些索引可能是最后一行),但您将使用该 XML更新所有行。<Submitted>False</Submitted>

于 2011-12-07T07:15:17.237 回答