SQL Server 2005 IsNumeric Не перехватывает '0310D45' - PullRequest
6 голосов
/ 13 апреля 2010

У меня есть это значение '0310D45'

Я использую isnumeric, чтобы проверить, являются ли значения числовыми перед приведением к bigint.К сожалению, это значение проходит числовую проверку.Так что мой запрос не отвечает:

Msg 8114, Level 16, State 5, Line 3
Error converting data type varchar to bigint.

Какой самый простой способ справиться с этим.Я думал об использовании charindex, но мне нужно было проверить все 26 букв.

Есть ли простое решение, которого я не вижу?Я действительно не хочу создавать пользовательскую функцию.

Спасибо

Ответы [ 3 ]

9 голосов
/ 13 апреля 2010

Взгляните на эту статью с именем Что не так с IsNumeric ()? , в которой содержится следующее резюме:

Аннотация: Функция ISNUMERIC () в T-SQL имеет проблему. Это может ложно интерпретировать нечисловые буквы и символы (например, D, E и £) и даже вкладки (CHAR (9)) как числовой.

К сожалению, похоже, что IsNumeric просто странный, и вам придется написать несколько строк T-SQL, чтобы обойти его. (Под странно я имею в виду, что, если оцениваемые данные могут быть преобразованы в ЛЮБОЙ числовой тип, они будут преобразованы.)

4 голосов
/ 21 января 2015

Я недавно столкнулся с этой проблемой и искал решение. Я думаю, что нашел два, и хотел опубликовать их здесь, чтобы другим было легче их найти. Первое решение заключается в использовании регулярного выражения и функции SQLServer PATINDEX ()

IF PATINDEX('%[^0-9]%', @testString) = 0

Второе решение - объединить строку 'e0' с вашей тестовой строкой и по-прежнему использовать функцию SQLServer ISNUMERIC () с объединенной строкой. ISNUMERIC не может обнаружить присутствие символов, таких как d, e, x, из-за различных обозначений, используемых в числовых форматах, но все же допускает использование только одного символа. Таким образом, конкатенация 'e0' не позволяет функции выдавать вам ложное значение true, когда это когда-либо требуется.

IF (ISNUMERIC (@testString + 'e0') = 1)

Надеюсь, это поможет

2 голосов
/ 13 апреля 2010

Посмотрите на этот SO вопрос , чтобы найти несколько альтернативных предложений для SQL Server ISNUMERIC ().

Я полагаю У Эрланда это есть как элемент соединения в его списке желаний - что-то, что он вызывает is_valid_convert ().

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