Каков наилучший способ пропустить прошлые ошибки приведения во время обновления SQL и продолжить? - PullRequest
5 голосов
/ 08 июня 2011

У меня есть столбец varchar в таблице, куда я хочу вставить его данные в другой столбец той же таблицы, где его тип данных - деньги. Некоторые из значений в исходном столбце являются большими числами, которые я хочу игнорировать и просто хочу установить эти значения в NULL.

Я пробовал это:

UPDATE MyTable SET destCol = CASE WHEN IsNumeric(sourceCol) = 1 THEN sourceCol END

Но это выдает «Ошибка арифметического переполнения ...» при попытке проверить большие числа.

Я думаю, что мне может понадобиться какая-то функция или использовать блок try / catch в хранимой процедуре, чтобы получить требуемую функциональность.

UPDATE

Я забыл упомянуть, что некоторые значения в исходном столбце имеют текстовые значения, которые вообще нельзя конвертировать в деньги, для них также должно быть установлено значение NULL.

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Если проблема вызвана огромными числами, вы можете ограничиться теми, которые можно преобразовать в money

UPDATE MyTable
SET destCol = CAST(sourceCol AS money)
WHERE  sourceCol < 922337203685477.5807

money диапазон - деньги от -922,337,203,685,477.5808 до 922,337,203,685,477.5807

[EDIT]

Итак, у вас есть колонка varchar. Вы можете сделать что-то вроде этого:

UPDATE MyTable
SET destCol = 
    CASE WHEN Len(sourceCol) < 15 AND ISNUMERIC(sourceCol) = 1 THEN CAST(sourceCol AS MONEY) ELSE 0 END
1 голос
/ 08 июня 2011

Если вы просто хотите преобразовать простые числа, то что-то вроде:

UPDATE MyTable SET destCol = CASE WHEN not sourceCol like '%[^0-9]%' and LEN(sourceCol) <= 8 THEN sourceCol END

Это попытается обновить destCol с любой строкой до 8 цифр.Если вам нужно разрешить символы валюты или тысячи или десятичные разделители, вам нужно включить их также в выражение LIKE.

Проблема, как всегда, с ISNUMERIC заключается в том, что он отвечает на вопрос, которыйникто не может использовать (может ли эта строка быть преобразована в любой из числовых типов?), а не что-то полезное (может ли эта строка быть преобразована в числовой тип 'X'?)

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