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

Har*_*aid 10 sql-server xquery-sql xquery-update sql-update

表名为 MasterTable

ID类型BIGINT,

Nametype 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
Run Code Online (Sandbox Code Playgroud)

运行查询时出现以下错误

非法使用xml数据类型方法'修改'.在此上下文中期望非变异方法.

Mik*_*son 19

您无法从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
Run Code Online (Sandbox Code Playgroud)

如果您需要这在一个时间超过一个排工作,你可以使用带有列的表变量id,并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
Run Code Online (Sandbox Code Playgroud)