Mit PATINDEX können
Sie den ersten Index des Auftretens von Mustern (Zeichenfolgen) ermitteln. Verwenden Sie dann STUFF, um eine weitere Zeichenfolge in das übereinstimmende Muster (Zeichenfolge) einzufügen .
Schleife durch jede Reihe. Ersetzen Sie alle unzulässigen Zeichen durch das, was Sie wollen. In Ihrem Fall ersetzen Sie nicht numerische durch Leerzeichen. Die innere Schleife ist, wenn Sie mehr als ein unzulässiges Zeichen in einer aktuellen Zelle haben, das der Schleife.
DECLARE @counter int
SET @counter = 0
WHILE(@counter < (SELECT MAX(ID_COLUMN) FROM Table))
BEGIN
WHILE 1 = 1
BEGIN
DECLARE @RetVal varchar(50)
SET @RetVal = (SELECT Column = STUFF(Column, PATINDEX('%[^0-9.]%', Column),1, '')
FROM Table
WHERE ID_COLUMN = @counter)
IF(@RetVal IS NOT NULL)
UPDATE Table SET
Column = @RetVal
WHERE ID_COLUMN = @counter
ELSE
break
END
SET @counter = @counter + 1
END
Achtung: Dies ist jedoch langsam! Eine Varchar-Säule kann sich auswirken. Die Verwendung von LTRIM RTRIM kann also etwas hilfreich sein. Egal, es ist langsam.
Kredit geht an dieser Stackoverflow Antwort.
EDIT Credit geht auch an @srutzky
Bearbeiten (von @Tmdean) Anstatt jeweils eine Zeile zu erstellen, kann diese Antwort an eine satzbasiertere Lösung angepasst werden. Es wird immer noch das Maximum der Anzahl nicht numerischer Zeichen in einer einzelnen Zeile wiederholt, daher ist es nicht ideal, aber ich denke, es sollte in den meisten Situationen akzeptabel sein.
WHILE 1 = 1 BEGIN
WITH q AS
(SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n
FROM Table)
UPDATE Table
SET Column = STUFF(Column, q.n, 1, '')
FROM q
WHERE Table.ID_Column = q.ID_Column AND q.n != 0;
IF @@ROWCOUNT = 0 BREAK;
END;
Sie können die Effizienz auch erheblich verbessern, wenn Sie eine Bitspalte in der Tabelle beibehalten, die angibt, ob das Feld noch bereinigt wurde. (NULL steht in meinem Beispiel für "Unbekannt" und sollte der Spaltenstandard sein.)
DECLARE @done bit = 0;
WHILE @done = 0 BEGIN
WITH q AS
(SELECT ID_Column, PATINDEX('%[^0-9.]%', Column) AS n
FROM Table
WHERE COALESCE(Scrubbed_Column, 0) = 0)
UPDATE Table
SET Column = STUFF(Column, q.n, 1, ''),
Scrubbed_Column = 0
FROM q
WHERE Table.ID_Column = q.ID_Column AND q.n != 0;
IF @@ROWCOUNT = 0 SET @done = 1;
UPDATE table
SET Scrubbed_Column = CASE
WHEN Scrubbed_Column IS NULL THEN 1
ELSE NULLIF(Scrubbed_Column, 0)
END;
END;
Wenn Sie Ihr Schema nicht ändern möchten, können Sie es einfach anpassen, um Zwischenergebnisse in einer Variablen mit Tabellenwert zu speichern, die am Ende auf die tatsächliche Tabelle angewendet wird.