【问题标题】:Update XML in SQL Server 2005 w/out Node causes Null Error在没有节点的 SQL Server 2005 中更新 XML 导致 Null 错误
【发布时间】:2011-12-07 00:29:09
【问题描述】:

所以我有一个脚本来更新/插入以下节点的 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

【问题讨论】:

  • 谢谢。这是我能做的最好的,这个该死的列是 TEXT 和数据 XML 没有办法改变列类型感谢设置它的客户。
  • 我认为我需要添加一个 IF EXISTS 语句,现在正在处理这个

标签: sql-server xml sql-server-2005 sqlxml


【解决方案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

注意:如果有不止一行包含&lt;Submitted&gt;False&lt;/Submitted&gt;,则此代码可能会出现问题。您将获得来自@temp 中一行的 XML(根据某些索引可能是最后一行),但您将使用该 XML 更新 &lt;Submitted&gt;False&lt;/Submitted&gt;all 行。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多