Domanda

Qual è il modo migliore per sostituire tutto '& amp; lt' con & amp; lt; in una data colonna del database? Fondamentalmente esegui s/&lt[^;[/</gi

Note:

  • deve funzionare in MS SQL Server 2000
  • Deve essere ripetibile (e non finire con & amp; lt ;;;;;;;;;; )
È stato utile?

Soluzione

È necessario un po 'di hacking, ma possiamo farlo con MI PIACE , PATINDEX , SINISTRA E DESTRA e buon vecchio concatenazione di stringhe.

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

Meglio è che questa è la versione di SQL Server agnostica e dovrebbe funzionare bene.

Altri suggerimenti

Penso che questo possa essere fatto in modo molto più pulito se usi diversi STUFF :)

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

Che ne dici di:

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

Modifica:

Ho appena capito che questo ignorerà le colonne con stringhe & amp; lt; parzialmente corrette.

In tal caso puoi ignorare la seconda parte della clausola where e chiamarla in seguito:

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

Questo articolo spiega come creare una semplice funzione Regex Replace che puoi utilizzare in SQL 2000 (e 2005 con una semplice modifica) che possa aiutarti.

Se il sapore regex di MSSQL supporta un aspetto negativo, quello sarebbe il modo giusto di affrontarlo.

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

rileverà tutte le istanze di & amp; lt che non sono seguite da un ; (anche se non sono seguite da nulla, che [^;] mancherebbe) e non cattura il seguente carattere non ; come parte della partita, eliminando il problema menzionato nei commenti sulla domanda originale di quel personaggio che si perde nella sostituzione.

Sfortunatamente, non uso MSSQL, quindi non ho idea se supporta o meno il lookahead negativo ...

Molto specifico a questo modello, ma in passato ho fatto qualcosa di simile:

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

esempio più ampio (codifica caratteri che potrebbero essere inappropriati in un attributo TITLE)

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')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top