10

表命名为MasterTable

ID类型BIGINT,

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

Name包含结构为的数据

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

当我需要表格时,那时我需要将其Update转换为然后有条件地更新/替换特定标签的部分,即。MasterVarcharxmlvalueen-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 数据类型方法“修改”。在这种情况下,需要一个非突变方法。

4

1 回答 1

20

您不能从 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名称的数据类型是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
于 2011-02-23T09:20:02.167 回答