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

时间:2011-02-23 07:08:06

标签: sql-server sql-update xquery-sql xquery-update

表名为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数据类型方法'修改'。在这种情况下,预计会有一种非变异方法。

1 个答案:

答案 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

如果您需要一次处理多行,则可以使用包含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