gpt4 book ai didi

sql-server - Sql Xquery 如何替换更新查询中的文本

转载 作者:行者123 更新时间:2023-12-02 10:00:24 25 4
gpt4 key购买 nike

表被命名为MasterTable

ID类型BIGINT ,

Name类型VARCHAR(200) (由于某些原因存储 xml 类型数据)

Name包含数据结构为

<en-US>SomeEnglishText</en-US><it-IT>SomeItalicText</it-IT>

当我需要UpdateMaster然后表当时我需要转换Varcharxml然后有条件地更新/替换 value特定标签的一部分,即 en-US / it-IT .

此外,Name 中也有可能没有数据/标签。列,所以我认为在插入数据时它会 Insert表中的空标记元素如 <en-US></en-US><it-IT></it-IT> ,所以update查询必须处理标记元素中的空值,即 en-US/it-IT .

我正在尝试像以下更新查询一样执行此操作。

DECLARE @Str VARCHAR(200)

SET @Str = 'Test Text'

UPDATE [MasterTable]
SET [Name] = cast([MasterTable].[Name] as xml).modify('replace value of (en-US/text())[1] with sql:variable("@Str")')
WHERE [ID]=18

运行查询时出现以下错误

Illegal use of xml data type method 'modify'. A non-mutator method is expected in this context.

最佳答案

您不能从 xml.modify 进行分配。修改直接作用于变量/列。您也不能在强制转换上使用修改。

您可以将名称提取到 xml 变量,修改 xml,然后将其放回表中。

declare @str varchar(200) = 'Test'
declare @xml xml

select @xml = cast(Name as xml)
from MasterTable
where ID = 18

set @xml.modify('replace value of (en-US/text())[1] with sql:variable("@Str")')

update MasterTable
set Name = cast(@xml as varchar(200))
where ID = 18

如果您需要一次处理多行,您可以使用包含 idname 列的表变量,其中 name 的数据类型为 xml 而不是 @xml 变量。

declare @str varchar(200) = 'Test Text'
declare @T table (ID int, Name xml)

insert into @T
select ID, cast(Name as xml)
from MasterTable
where Name is not null

update @T
set Name.modify('replace value of (en-US/text())[1] with sql:variable("@Str")')

update MasterTable
set Name = cast(T.Name as varchar(200))
from @T as T
where MasterTable.ID = T.ID

关于sql-server - Sql Xquery 如何替换更新查询中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5087950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com