Frage

Was ist der beste Weg, um all ‚<‘ mit &lt; in einer bestimmten Datenbankspalte zu ersetzen? Grundsätzlich führen s/&lt[^;]/&lt;/gi

Weitere Informationen:

  • muss arbeiten in MS SQL Server 2000
  • muss wiederholbar sein (und nicht mit &lt;;;;;;;;;; Ende)
War es hilfreich?

Lösung

Einige Hacking erforderlich, aber wir können dies mit LIKE , PATINDEX , links und rechts und den guten alten String-Verkettung.

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

Es ist besser, dass diese SQL Server-Version Agnostiker ist und sollte gut funktionieren.

Andere Tipps

Ich denke, das viel sauberer gemacht werden kann, wenn Sie verschiedene Dinge verwenden:)

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

Wie wäre:

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

Edit:

Ich habe gerade realisiert diese Spalten mit teilweise richtig &lt; Strings ignoriert.

In diesem Fall können Sie den zweiten Teil der Where-Klausel ignorieren und nennen dies später:

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

diesem Artikel beschreibt, wie eine einfache Regex-Funktion erstellen, ersetzen, die Sie in SQL 2000 (und 2005 mit einfachen zwicken) verwenden können, die Ihnen helfen können.

Wenn MSSQL regex Geschmack negative Vorschau unterstützt, das wäre der richtige Weg, dies zu nähern.

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

werden alle Instanzen von fangen < , die befolgt werden nicht durch ein ; (auch wenn sie durch nichts gefolgt sind, die [^;] vermissen würde) und erfasst nicht die folgenden, nicht ;. Charakter als Teil des Spiels, um das Problem in den Kommentaren auf die ursprüngliche Frage dieses Zeichens erwähnt Beseitigung der Ersatz verloren

Leider benutze ich MSSQL nicht, so habe ich keine Ahnung, ob es negative Vorschau unterstützt oder nicht ...

auf dieses Muster sehr spezifisch, aber ich habe dazu in der Vergangenheit getan ähnlich:

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

breiteres Beispiel (codieren Zeichen, die in einem Titel-Attribute ungeeignet sein können)

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')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top