表名为MasterTable
列
ID
输入BIGINT
,
Name
输入VARCHAR(200)
(出于某些原因存储xml
类型数据)
Name
包含以
<en-US>SomeEnglishText</en-US><it-IT>SomeItalicText</it-IT>
当我需要Update
Master
表时,我需要将Varchar
转换为xml
,然后有条件地更新/替换特定标记的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
运行查询时出现以下错误
非法使用xml数据类型方法'修改'。在这种情况下,预计会有一种非变异方法。
答案 0 :(得分:18)
您无法从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
如果您需要一次处理多行,则可以使用包含id
和name
列的表变量,其中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