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>
当我需要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
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)
| 归档时间: |
|
| 查看次数: |
11651 次 |
| 最近记录: |