将 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 中也可以。
- 使用主键 from
tbl_Module_RequestForms_Items
和 XMLData 列声明一个表变量,但数据类型为 XML。
- 将行从复制
tbl_Module_RequestForms_Items
到应更新的表变量。
- 使用 更新 XML
replace value of
。
- 将更改应用回
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