Можете да използвате PATINDEX, за да намерите първия индекс на появата на шаблона (низ). След това използвайте STUFF, за да напълните друг низ в съответстващия модел(низ).
Прокарайте през всеки ред. Заменете всеки нелегален символ с това, което искате. Във вашия случай заменете нечисловото с празно. Вътрешният цикъл е, ако имате повече от един непозволен знак в текущата клетка, този на цикъла.
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
Внимание:Това обаче е бавно! Наличието на колона varchar може да повлияе. Така че използването на LTRIM RTRIM може да помогне малко. Независимо от това е бавно.
Заслугата е на този отговор на StackOverFlow.
EDITCredit също отива на @srutzky
Редактиране (от @Tmdean) Вместо да правите един ред наведнъж, този отговор може да бъде адаптиран към по-базирано на набор решение. Той все още повтаря максималния брой нечислови знаци в един ред, така че не е идеално, но мисля, че трябва да е приемливо в повечето ситуации.
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;
Можете също така да подобрите ефективността доста, ако поддържате битова колона в таблицата, която показва дали полето все още е пречистено. (NULL представлява „Неизвестно“ в моя пример и трябва да бъде колоната по подразбиране.)
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;
Ако не искате да променяте схемата си, това е лесно да се адаптира за съхраняване на междинни резултати в таблично стойностна променлива, която се прилага към действителната таблица в края.