K nalezení prvního indexu výskytu vzoru (řetězce) můžete použít PATINDEX. Poté pomocí STUFF nacpete další řetězec do shodného vzoru (řetězce).
Projděte každý řádek. Nahraďte každý nelegální znak tím, co chcete. Ve vašem případě nahraďte nenumerické místo prázdným. Vnitřní smyčka je, pokud máte více než jeden nepovolený znak v aktuální buňce smyčky.
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
Pozor:Je to pomalé! Mít sloupec varchar může mít vliv. Takže použití LTRIM RTRIM může trochu pomoci. Bez ohledu na to je to pomalé.
Kredit jde na tuto odpověď StackOverFlow.
EDITCredit jde také na @srutzky
Upravit (od @Tmdean) Namísto provádění jednoho řádku po druhém lze tuto odpověď přizpůsobit řešení více založenému na sadě. Stále iteruje maximální počet nenumerických znaků v jednom řádku, takže to není ideální, ale myslím, že by to mělo být přijatelné ve většině situací.
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;
Efektivitu můžete také značně zlepšit, pokud v tabulce budete udržovat sloupec bitů, který ukazuje, zda bylo pole již vyčištěno. (NULL v mém příkladu představuje "Neznámý" a měl by být výchozím sloupcem.)
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;
-- if Scrubbed_Column is still NULL, then the PATINDEX
-- must have given 0
UPDATE table
SET Scrubbed_Column = CASE
WHEN Scrubbed_Column IS NULL THEN 1
ELSE NULLIF(Scrubbed_Column, 0)
END;
END;
Pokud nechcete měnit své schéma, je snadné jej přizpůsobit tak, aby se mezivýsledky ukládaly do proměnné s hodnotou tabulky, která se na konci aplikuje na skutečnou tabulku.