【问题标题】:How to replace a part of XML node in SQL Server 2005如何在 SQL Server 2005 中替换部分 XML 节点
【发布时间】:2011-05-03 12:03:01
【问题描述】:

我想知道如何使用 xquery 在 SQL Server 2005 中更新 XML 节点的部分文本

在下面的例子中,我想用“优秀”代替“非常”这个词

    declare @xml as xml
    set @xml = '<root><info>well hello this is a very good example</info></root>'
    declare @replacement as varchar(50)
    set @replacement = 'excellent'
    declare @search as varchar(50)
    set @search = 'very'

    set @xml.modify('replace value of (/root/info/text())[1]
                     with replace((/root/info/text())[1],sql:variable("@search"),sql:variable("@replacement"))'
        )
    select @xml

任何帮助将不胜感激

【问题讨论】:

    标签: sql-server-2005 replace xquery-sql


    【解决方案1】:

    由于您要替换的这个词不是 XML 标记的内容 - 而只是该内容的一部分 - 您可能只想查看基于文本的替换选项。

    如果你有这样的东西,它会起作用:

    declare @xml as xml
    
    set @xml = '<root><info>well hello this is a <rating>very good</rating> example</info></root>'
    

    然后,您可以进入 XML 并将 &lt;rating&gt;....&lt;/rating&gt; 的内容替换为其他内容:

    declare @replacement as varchar(50)
    set @replacement = 'excellent'
    
    set 
        @xml.modify('replace value of (/root/info/rating/text())[1]
                     with sql:variable("@replacement")')
    
    select @xml
    

    但就目前而言,您可能必须获取 &lt;info&gt; 的文本内容并对其进行文本替换:

    DECLARE @xml as XML
    SET @xml = '<root><info>well hello this is a very good example</info></root>'
    
    DECLARE @newcontent VARCHAR(1000)
    SELECT @newcontent = @xml.value('(/root/info/text())[1]', 'VARCHAR(1000)')
    
    -- replace "very" with "excellent"    
    SELECT @newcontent = REPLACE(@newcontent, 'very', 'excellent')
    
    SET 
    @xml.modify('replace value of (/root/info/text())[1]
                     with sql:variable("@newcontent")')
    
    SELECT @xml
    

    【讨论】:

    • 但是如果info标签的内容大于varchar(1000),更像是一个nvarchar(max),你怎么处理这种情况呢? (即:info 的内容是一个 html 块,您可以通过数据库替换 html 块中的值)
    • @peter:只要内容不是 XML 标记(或 XML 属性)的完整内容,我认为这种方法无论如何都是不好的。我会在使用该数据的应用程序中执行此操作,而不是在 SQL Server 本身中。在我看来,只有当您可以用新内容替换完整的 XML 标记的内容时,这种方法才是可取的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多