Pergunta

O que é a melhor maneira de substituir todos '& lt' com < em uma determinada coluna de banco de dados? Basicamente realizar s/&lt[^;]/</gi

Notas:

  • O trabalho deve em MS SQL Server de 2000
  • Deve ser repetitivo (e não acabar com <;;;;;;;;;)
Foi útil?

Solução

Alguns hacking necessário, mas podemos fazer isso com COMO , PATINDEX , esquerdo e DIREITO e bom e velho concatenação.

create table test
(
    id int identity(1, 1) not null,
    val varchar(25) not null
)

insert into test values ('&lt; <- ok, &lt <- nok')

while 1 = 1
begin
    update test
        set val = left(val, patindex('%&lt[^;]%', val) - 1) +
                      '&lt;' +
                      right(val, len(val) - patindex('%&lt[^;]%', val) - 2)
    from test
    where val like '%&lt[^;]%'

    IF @@ROWCOUNT = 0 BREAK
end

select * from test

Melhor é que este é o SQL Server versão agnóstico e deve funcionar muito bem.

Outras dicas

Eu acho que isso pode ser feito muito mais limpo se você usar coisas diferentes:)

create table test
(
    id int identity(1, 1) not null,
    val varchar(25) not null
)

insert into test values ('&lt; <- ok, &lt <- nok')

WHILE 1 = 1
BEGIN
    UPDATE test SET
        val = STUFF( val , PATINDEX('%&lt[^;]%', val) + 3 , 0 , ';' )
    FROM test
    WHERE val LIKE '%&lt[^;]%'

    IF @@ROWCOUNT = 0 BREAK
END

select * from test

Como sobre: ??

    UPDATE tableName
    SET columName = REPLACE(columName , '&lt', '&lt;')
    WHERE columnName LIKE '%lt%'
    AND columnName NOT LIKE '%lt;%'

Editar:

Eu só percebi isso irá ignorar colunas com cordas &lt; parcialmente corretas.

Nesse caso, você pode ignorar a segunda parte da cláusula onde e chamar isso depois:

    UPDATE tableName
    SET columName = REPLACE(columName , '&lt;;', '&lt;')

Este artigo aborda como criar um simples Regex substituir função que você pode usar no SQL 2000 (e 2005 com um simples puxão) que pode ajudá-lo.

Se suportes sabor de regex de MSSQL lookahead negativo, que seria a maneira correta de abordar isso.

s/&lt(?!;)/&lt;/gi

vai pegar todas as instâncias de & lt que não são seguidos por um ; (mesmo se eles são seguidos por nada, o que [^;] perderia) e não capturar o seguinte não ;. caráter como parte do jogo, eliminando o problema mencionado nos comentários sobre a pergunta original de que o personagem sendo perdida na substituição

Infelizmente, eu não uso MSSQL, então eu não tenho idéia se ele suporta lookahead negativo ou não ...

Muito específico para esse padrão, mas tenho feito semelhante a este no passado:

REPLACE(REPLACE(columName, '&lt;', '&lt'), '&lt', '&lt;')

exemplo mais amplo (caracteres codificam o qual pode ser inadequado em um atributo TÍTULO)

REPLACE(REPLACE(REPLACE(REPLACE(
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
    columName
    -- Remove existing encoding:
    , '&amp;', '&')
    , '&#34;', '"')
    , '&#39;', '''')
    -- Reinstate/Encode:
    , '&', '&amp;')
    -- Encode:
    , '"', '&#34;')
    , '''', '&#39;')
    , ' ', '%20')
    , '<', '%3C')
    , '>', '%3E')
    , '/', '%2F')
    , '\', '%5C')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top