【问题标题】:Update XML Node with Conversion in SQL Server 2005在 SQL Server 2005 中使用转换更新 XML 节点
【发布时间】:2011-12-05 16:55:09
【问题描述】:

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

【问题讨论】:

  • 如果它 IS XML - 将其设为 XML 列 - 您将省去很多麻烦和麻烦 ....
  • 周围有没有。很难解释,但在这一点上,我无法更改列类型。我得到了选择工作,但无法让这个更新工作。谢谢

标签: sql-server xml sql-server-2008 xquery-sql


【解决方案1】:

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

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

我假设IDtbl_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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 2017-01-03
    相关资源
    最近更新 更多