【问题标题】:Updating XML value within MSSQL在 MSSQL 中更新 XML 值
【发布时间】:2016-08-29 14:27:19
【问题描述】:

在大型 XML 文本值 MSSQL 中替换 XML 标记值。

在 MSSQL 中,我有一个名为 form 的列,它是一个带有非常大的 XML 的文本列。我需要找到某个标签并将标签内该子标签的值从 False 更改为 True。

这是我目前拥有的:

USE trainset;
UPDATE dbo.users 
SET formxml = REPLACE(CAST(formxml as nvarchar(max)), '%<ttaycheckbox><name>cbTermsConditions</name><cargo>F</cargo></ttaycheckbox>%', '<ttaycheckbox><name>cbTermsConditions</name><cargo>T</cargo></ttaycheckbox>')

WHERE usersid = '0000GARX'
and formname ='ffOrderRpt'
and formxml LIKE ('%<ttaycheckbox><name>cbTermsConditions</name><cargo>F</cargo></ttaycheckbox>%')

好像正在更新; 但是,在此之后,当我对这个特定值进行选择时,它的值仍然是 False 而不是 True。

我缺少什么导致它无法正确更新?

【问题讨论】:

  • 在几乎所有情况下,将现有 XML 转换为字符串类型、在此处修改并将其转换回来都是一种糟糕的方法。这可能会产生副作用(例如吞下CDATA 部分)。如果可能,您应该使用 real XML 方法,在本例中为 .modify()

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


【解决方案1】:

replace() 不支持通配符。所以你的where ... like 找到了相关记录,但replace 没有找到任何东西,因为它正在寻找文字%

【讨论】:

  • 啊,好吧,这就解释了......那我该怎么做呢?因为我只需要替换那里的子字符串。
  • replace('&lt;foo&gt;1&lt;/foo&gt;', '&lt;foo&gt;0&lt;/foo'),完全一样。只是不要将通配符放入替换语句中。您已经限制了 replace() 可以通过 where ... like 过滤处理的记录。
  • 谢谢马克。不敢相信我错过了。
【解决方案2】:

您可以使用 XML modifyexist

UPDATE users 
SET formxml.modify('replace value of (/ttaycheckbox/cargo/text())[1] with "T"')
WHERE usersid = '0000GARX'
and formname ='ffOrderRpt'
and formxml.exist('/ttaycheckbox/name[text()[1] eq "cbTermsConditions"]') = 1 
and formxml.exist('/ttaycheckbox/cargo[text()[1] eq "F"]') = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2012-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    相关资源
    最近更新 更多