Почему «0D0» считается числовым в SQL Server 2008? - PullRequest
7 голосов
/ 13 декабря 2010

Есть идеи, почему ISNUMERIC('0D0') = 1 ИСТИНА в SQL Server 2008?

Я проверяю идентификационные номера из другой системы, которая иногда содержит буквы, которые мы не хотим переносить, но эта комбинация вызывает отключение кода (конкретный идентификатор, который он считает числовым, - «005406257D6»). Вниз по течению мы делаем CONVERT(BIGINT, @val), что явно задыхается, когда он находит эти значения "D".

В каком особом случае я бьюсь, и как мне это объяснить?

Ответы [ 2 ]

11 голосов
/ 13 декабря 2010

По сути, IsNumeric бесполезен - все, что он проверяет, это то, что строка может быть преобразована в любой числовых типов. В этом случае «0D0» может быть преобразовано в число с плавающей точкой. (Я не могу вспомнить причину, но фактически «D» является синонимом «E» и означает, что это научная запись):

select CONVERT(float,'2D3')

2000

Если вы хотите проверить, что это просто цифры, то not @val like '%[^0-9]%' будет лучшим тестом. Вы можете улучшить это, добавив также проверку длины.

0 голосов
/ 13 декабря 2010

Хорошее объяснение почему.

http://www.sqlservercentral.com/articles/IsNumeric/71512/

(ниже приведен более исчерпывающий запрос / список @ RedFilter)

SELECT  [Ascii Code] = STR(Number)
       ,[Ascii Character] = CHAR(Number)
       ,[ISNUMERIC Returns] = ISNUMERIC(CHAR(Number))
FROM    Master.dbo.spt_Values
WHERE   Type = 'P'
        AND Number BETWEEN 0 AND 255
        AND ISNUMERIC(CHAR(Number)) = 1
UNION
SELECT  [Ascii Code] = STR(Number)
       ,[Ascii Character] = CHAR(Number)
       ,[ISNUMERIC Returns] = ISNUMERIC('0' + CHAR(Number) + '0')
FROM    Master.dbo.spt_Values
WHERE   Type = 'P'
        AND Number BETWEEN 0 AND 255
        AND ISNUMERIC('0' + CHAR(Number) + '0') = 1

yeilds

Ascii Code Ascii Character
---------- ---------------
     0      
     9      
    10      
    11      
    12      
    13      
    36  $   
    43  +   
    44  ,   
    45  -   
    46  .   
    48  0   
    49  1   
    50  2   
    51  3   
    52  4   
    53  5   
    54  6   
    55  7   
    56  8   
    57  9   
    68  D   
    69  E   
    92  \   
   100  d   
   101  e   
   128  €   
   160      
   162  ¢   
   163  £   
   164  ¤   
   165  ¥   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...