Question

Quel est le meilleur moyen de remplacer tous les '& amp; lt' par & amp; lt; dans une colonne de base de données donnée? Effectuez essentiellement s / & amp; lt [^;] / & gi

Notes:

  • doit fonctionner dans MS SQL Server 2000
  • Doit être répétable (et ne pas finir avec & amp; lt ;;;;;;;;;;; )
Était-ce utile?

La solution

Certains piratages sont nécessaires, mais nous pouvons le faire avec LIKE , PATINDEX , À gauche ET À droite , et bon vieux concaténation de chaînes.

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

Mieux, c’est une version indépendante de SQL Server qui devrait fonctionner correctement.

Autres conseils

Je pense que cela peut être fait beaucoup plus propre si vous utilisez différents 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

Que diriez-vous de:

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

Modifier:

Je viens de me rendre compte que cela ignorerait les colonnes contenant des chaînes partiellement correctes.

Dans ce cas, vous pouvez ignorer la deuxième partie de la clause where et l'appeler ensuite:

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

Cet article explique comment créer une fonction simple de remplacement de regex que vous pouvez utiliser dans SQL 2000 (et 2005 avec un simple tweak) et pouvant vous aider.

Si la saveur de regex de MSSQL prend en charge la présentation négative, ce serait la meilleure façon de procéder.

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

capturera toutes les instances de & amp; lt qui ne sont pas suivies d'un ; (même si elles ne sont suivies de rien, ce qui [^;] manquerait) et ne prend pas en compte le caractère non ; suivant, ce qui élimine le problème mentionné dans les commentaires sur la question initiale de la perte de ce personnage dans le remplaçant.

Malheureusement, je n’utilise pas MSSQL. Je ne sais donc pas si elle prend en charge l’appel négatif ou non.

Très spécifique à ce modèle, mais j’ai fait la même chose dans le passé:

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

exemple plus large (code des caractères pouvant être inappropriés dans un attribut 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')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top