Изменить тип столбца базы данных, игнорируя при этом ошибки преобразования с использованием SQL - PullRequest
1 голос
/ 18 июня 2009

Это похоже на предыдущий вопрос MSSQL: изменить тип столбца с числами с varchar на int , за исключением того, что в этом случае не все исходные данные могут быть успешно преобразованы из varchar в int. В этих случаях я хочу, чтобы результат был NULL.

Например, входящий набор значений в столбце varchar будет выглядеть так: {'123', '234', '345', 'A', '456'}. После преобразования из varchar в int я хочу, чтобы столбец содержал значения {123, 234, 345, NULL, 456}. На практике у меня будет около 99% успеха.

Хотя общее решение было бы идеальным, я использую SQL Server 2005 и мне нужно внести изменения в Transact SQL.

РЕДАКТИРОВАТЬ: IsNumeric предложения действительно преодолеть часть пробела, но не являются полными. Например, если набор данных содержит числовые, но не целочисленные данные, исправление IsNumeric не работает (и, похоже, IsInteger). В частности, следующий набор не будет преобразовывать {'123.456', '$ 12'}, где они оба являются числовыми в соответствии с SQL Server IsNumeric, но не будет преобразовывать в Int.

Ответы [ 3 ]

2 голосов
/ 18 июня 2009
  1. Выполнить это первым:

    обновить набор таблиц field = null, где ISNUMERIC (field) = 0

  2. Затем измените тип

2 голосов
/ 18 июня 2009

После часа взлома и под руководством других ответов вот что я придумал:

  1. Очистите данные, чтобы обеспечить преобразование информации. Поскольку функции IsInteger нет, используйте IsNumeric для установки на NULL всего, что не может быть преобразовано вообще.

  2. Преобразуйте все оставшиеся данные в тип MONEY, который эффективно избавит от символов валюты, которые были ранее приняты IsNumeric.

  3. Преобразуйте тип денег в целое число, чтобы избавиться от дроби.

  4. Наконец, измените тип данных.

Следующий тест демонстрирует использование SQL:

CREATE TABLE tbl ( 
    id INTEGER IDENTITY NOT NULL,
    col VARCHAR(20)
)

INSERT INTO tbl (col) VALUES ('123')
INSERT INTO tbl (col) VALUES ('ABC')
INSERT INTO tbl (col) VALUES ('123.456')
INSERT INTO tbl (col) VALUES ('$12')

UPDATE tbl SET col = CASE WHEN IsNumeric(col) = 1 THEN Convert(INTEGER, (Convert(MONEY, col))) ELSE NULL END
ALTER TABLE tbl ALTER COLUMN col INTEGER

SELECT * FROM tbl
2 голосов
/ 18 июня 2009
  1. Запустите обновление следующим образом:

    .. ЗАДАВАТЬ OldValue = CASE, КОГДА ISNUMERIC (Oldvalue) = 1, THEN Oldvalue ELSE NULL END ...

  2. Run

    ALTER TABLE dbo.Mytable ALTER COLUMN OldValue int - Добавить NULL или NOT NULL при необходимости

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...