【问题标题】:Sql Xquery How to Replace text in Update QuerySql Xquery 如何替换更新查询中的文本
【发布时间】:2011-02-23 07:08:06
【问题描述】:

表被命名为MasterTable

ID 输入BIGINT,

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

Name 包含结构如下的数据

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

当我需要Update Master 表时,那时我需要将Varchar 转换为xml 然后有条件地更新/替换 value 部分特定的标签,即en-US / it-IT

Name 列中也有 No data/tags 的可能性,所以我认为在插入数据时它会 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数据类型方法'modify'。在这种情况下需要一个非mutator方法。

【问题讨论】:

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


    【解决方案1】:

    您不能从 xml.modify 进行分配。修改直接作用于变量/列。您也不能在演员表上使用 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 的表变量,其中名称的数据类型是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
    

    【讨论】:

    • 我已将此 declare @str varchar(200) = 'Test' 更改为 declare @str varchar(200) set @str = 'Test' 并且有效.. 非常感谢
    • 如果以前的代码是COALESCE(@Name, Name),现在我想将其更改为UPDATE MasterTable set Name = Name.modify('replace value of (en-US/text())[1] with sql:variable("@Str")') where ID = 18,您能告诉我该怎么做,即处理@Str中的NULL
    • 同样Name 列是VARCHAR(200) 所以我面临直接调用modify 的问题
    • @Harsh:您不能直接在 varchar 列上调用 modify。您需要将其移动到 xml 列(或变量)以使用修改,如我答案中的代码中所示。
    • 所以在这里我们需要首先在单独的@xml 变量中获取值,所以如果我们有多个列作为我们想要更新的Name,那么我们需要声明多个@xml更新多个语言列的变量,我认为这不好......
    猜你喜欢
    • 2016-03-25
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 2018-03-07
    • 2020-05-08
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多