sql-server – 在SQL Server 2005中使用转换更新XML节点

我有一个包含
XML数据的列,但它是TEXT类型而不是XML类型. (由于其他原因,我必须这样离开).

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

错误消息:关键字“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>

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

如果您在XML列中拥有数据,则可以使用XML DML来修改XML.在你的情况下,你会像这样使用replace value of.

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中也可以.

>使用来自tbl_Module_RequestForms_Items和XMLData列的主键声明表变量,但作为数据类型XML.
>将行从tbl_Module_RequestForms_Items复制到应更新的表变量.
>使用替换值更新XML.
>将更改应用回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
点赞