Как заменить строки '&' на '&&' в текстовом поле - PullRequest
0 голосов
/ 17 января 2019

Это для SQL Server 2000, и я не могу изменить это: (

У меня проблемы с поиском строки

&

и замена его на

&&

Я нацеливаюсь на текстовое поле (не полнотекстовое индексированное)

Я пытался с

UPDATE documents
SET doc_xml = REPLACE(doc_xml, '&' , '&&')

но это не работает, так как мне нужно бежать от символа & char. Я пытался с

ESCAPE '\'

в конце, но не повезло.

Пример целевого содержимого:

<FOLDER_Name>Buy&amp;&amp;Go</FOLDER_Name>
<PRODUCT_Name>Buy &amp;&amp; Go</PRODUCT_Name>
<SKU_Name>Buy &amp; Go</SKU_Name>
<COMPANY_Name>AT&amp;T</COMPANY_Name>   

Я хочу заменить только один

 &amp; 

в этих двух последних строках, и результат, который мне нужно получить, таков:

<FOLDER_Name>Buy&amp;&amp;Go</FOLDER_Name>
<Product_Name>Buy &amp;&amp; Go</Product_Name>
<SKU_Name>Buy &amp;&amp; Go</SKU_Name>
<COMPANY_Name>AT&amp;&amp;T</COMPANY_Name>

Я должен оставить пробелы, как в исходном содержимом, а также не изменять строки, в которых уже есть двойной амперсанд

&amp;&amp;  

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Может быть, это может работать на SQL2000:

UPDATE documents
SET doc_xml =
REPLACE(
    REPLACE(
        REPLACE(CAST(doc_xml as varchar(8000))
            ,'&amp;&amp;', '&&'
                )
            ,'&amp;', '&amp;&amp;'
            )
            ,'&&', '&amp;&amp;'
        )

Вы можете примерить вашу SSMS:

DECLARE @doc_xml varchar(4000)
SET @doc_xml =
'<FOLDER_Name>Buy&amp;&amp;Go</FOLDER_Name>
<PRODUCT_Name>Buy &amp;&amp; Go</PRODUCT_Name>
<SKU_Name>Buy &amp; Go</SKU_Name>
<COMPANY_Name>AT&amp;T</COMPANY_Name>'

PRINT
REPLACE(
    REPLACE(
        REPLACE(@doc_xml
            ,'&amp;&amp;', '&&'
                )
            ,'&amp;', '&amp;&amp;'
            )
            ,'&&', '&amp;&amp;'
        )
0 голосов
/ 17 января 2019

Одним из способов было бы выполнить замену дважды, а вторым - исправить значения квадратов.

declare @table table (x xml)
insert into @table
values( 
'<FOLDER_Name>Buy&amp;&amp;Go</FOLDER_Name>
<PRODUCT_Name>Buy &amp;&amp; Go</PRODUCT_Name>
<SKU_Name>Buy &amp; Go</SKU_Name>
<COMPANY_Name>AT&amp;T</COMPANY_Name>')

update @table
set x = convert(xml,
                replace(
                    replace(convert(varchar(max),x),'&amp;','&amp;&amp;'),'&amp;&amp;&amp;&amp;','&amp;&amp;'
                    )

                )

select * from @table

Если это не столбец xml, тогда:

declare @table table (x varchar(max))
insert into @table
values( 
'<FOLDER_Name>Buy&amp;&amp;Go</FOLDER_Name>
<PRODUCT_Name>Buy &amp;&amp; Go</PRODUCT_Name>
<SKU_Name>Buy &amp; Go</SKU_Name>
<COMPANY_Name>AT&amp;T</COMPANY_Name>')

update @table
set x =     replace(
                replace(x,'&amp;','&amp;&amp;'),'&amp;&amp;&amp;&amp;','&amp;&amp;'
                )

select * from @table

Итак, ваш код будет выглядеть примерно так:

UPDATE documents
SET doc_xml = 
    convert(xml,
                replace(
                    replace(convert(varchar(max),x),'&amp;','&amp;&amp;'),'&amp;&amp;&amp;&amp;','&amp;&amp;'
                    )

                )
...