我有一个包含
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