Как заменить часть узла XML в SQL Server 2005 - PullRequest
5 голосов
/ 03 мая 2011

Я хотел бы знать, как я могу обновить часть текста узла XML в SQL Server 2005, используя xquery

В следующем примере я хотел бы заменить слово «очень» на «отлично»"

    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

Буду признателен за любую помощь

1 Ответ

2 голосов
/ 03 мая 2011

Поскольку это слово, которое вы хотите заменить, не является содержимым тега XML, а является только частью этого содержимого, вы можете просто захотеть проверить варианты замены на основе текста.

Это будет работать, еслиу вас было что-то вроде этого:

declare @xml as xml

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

Затем вы могли бы обратиться к XML и заменить содержимое <rating>....</rating> чем-то другим:

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

Но в нынешнем виде,вам, вероятно, придется взять текстовое содержимое <info> и сделать текстовую замену этому:

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
...