Ви можете використовувати 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.
EDIT Credit також надходить на @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;
UPDATE table
SET Scrubbed_Column = CASE
WHEN Scrubbed_Column IS NULL THEN 1
ELSE NULLIF(Scrubbed_Column, 0)
END;
END;
Якщо ви не хочете змінювати свою схему, це легко адаптувати для зберігання проміжних результатів у змінній, що має значення таблиці, яка застосовується до фактичної таблиці в кінці.