4

我有一列包含 XML 数据,但是是 TEXT 类型而不是 XML 类型。(出于另一个原因,我不得不这样离开它)。

基本上我需要先将其转换为 NText,然后再转换为 XML。唯一的问题是我当前用于选择节点值的格式无法更新它。

错误消息:关键字“AS”附近的语法不正确。

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

XML 数据:

 <Record>
   <Submitted>False</Submitted>
 </Record>
4

1 回答 1

2

将 XML 存储在[n]varchar(max). 如果您只想存储 XML 完全可以,但是如果您想使用 TSQL 修改 XML 的一部分,或者如果您需要查询 XML 的值或在 where 子句中使用节点/属性值,您应该切换到 XML where您可以从数据索引中受益并跳过类型转换。由于text已弃用,您至少应该考虑将数据类型切换为[n]varchar(max)

如果您将数据放在 XML 列中,您将使用XML DML来修改 XML。在您的情况下,您将使用这样的替换值

update tbl_Module_RequestForms_Items
set XMLData.modify('replace value of (/Record/Submitted/text())[1] with "True"')
where XMLData.value('(/Record/Submitted)[1]', 'bit') = 0

如果没有 XML 数据类型是不可能的,那么您必须提取整个 XML 文档,对其进行修改,然后使用修改后的 XML 文档更新表。

您当然可以使用某种客户端开发工具来做到这一点,但在 TSQL 中也可以。

  1. 使用主键 fromtbl_Module_RequestForms_Items和 XMLData 列声明一个表变量,但数据类型为 XML。
  2. 将行从复制tbl_Module_RequestForms_Items到应更新的表变量。
  3. 使用 更新 XML replace value of
  4. 将更改应用回tbl_Module_RequestForms_Items.

像这样的东西,我假设这ID是主键tbl_Module_RequestForms_Items并且您的 XML 数据在列中XMLData

declare @T table
(
  ID int primary key,
  XMLData xml
)

insert into @T 
select M.ID,
       M.XMLData
from tbl_Module_RequestForms_Items as M
where cast(cast(XMLData as nvarchar(max)) as xml).value('(/Record/Submitted)[1]', 'bit') = 0

update @T
set XMLData.modify('replace value of (/Record/Submitted/text())[1] with "True"')

update M
set XMLData = cast(T.XMLData as nvarchar(max))
from tbl_Module_RequestForms_Items as M
  inner join @T as T
    on M.ID = T.ID
于 2011-12-05T22:29:10.223 回答