2010-12-13 2 views
7

ISNUMERIC('0D0') = 1이 SQL Server 2008에서 TRUE 인 이유는 무엇입니까?SQL Server 2008에서 "0D0"이 숫자로 간주되는 이유는 무엇입니까?

다른 시스템의 ID 번호를 확인하는 중입니다.이 시스템에는 가져 오기를 원하지 않는 문자가 포함되어 있지만이 조합은 코드를 트리핑합니다 (숫자로 생각되는 특정 ID는 "005406257D6"입니다). . 하류 우리는 CONVERT(BIGINT, @val)을하고 있는데,이 "D"값을 찾을 때 분명히 질식합니다.

내가 어떤 타격을 가하는 특별한 경우가 있으며이를 어떻게 설명 할 수 있습니까?

+0

일이 yeilds (아래 RedFilter의보다 포괄적 인 질의/목록 @입니다) AC (그래서 16 진수 아니에요) ... – JNK

+0

또한 http://stackoverflow.com/questions/2358147/best-equivalent-for-isinteger-in-sql-server에서 답변을 gbn에 의해 흥미롭고 가치가있다 IMO .. –

+0

@JNK afaik "D"는 십진수를 나타냅니다. –

답변

11

기본적으로 IsNumeric은 쓸모가 없습니다. 문자열이 숫자 유형의 모든으로 변환 될 수 있다는 것만 큼 확실합니다. 이 경우, "0D0"은 float로 변환 될 수 있습니다. (나는 이유를 기억할 수는 없지만, 효과적으로 "D"는 과학적 표기법 "E"의 동의어이며, 그것의 의미) :

select CONVERT(float,'2D3') 

2000

확인하려는 경우 그것은 단지 숫자 일 뿐이므로 not @val like '%[^0-9]%'이 더 나은 테스트 일 것입니다. 길이 검사를 추가하여이를 더 향상시킬 수 있습니다.

+0

사실 "0D0"LIKE '% [^ 0-9] %'도 TRUE이지만, 귀하의 요점을 봅니다. – gfrizzle

+0

@gfrizzle - 시작시 'not'가 누락되었습니다. –

+0

@gfrizzle - 처음에는 NOT을 나타내는 '^'가 있기 때문에 해당 표현식에 'NOT LIKE'를 수행해야합니다. 나는. 당신은 "모든 숫자가 아닌가?"라고 묻고 있습니다. – JNK

0

이유에 대한 좋은 설명. 그것은 또한 'E'에 대한 작업처럼 보이지만하지 않는 -

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

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 

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 ¥ 
+0

실제로는 SELECT [ASCII 코드] = STR (번호), [ASCII 문자] = CHAR (숫자), [ISNUMERIC Returns] = ISNUMERIC (CHAR (번호)) FROM Master.dbo 여야합니다. spt_Values ​​ WHERE 0 255 AND ISNUMERIC (CHAR (수)) = 1 내지 타입 = 'P' AND 번호 연합 SELECT [ASCII 코드 = STR (숫자), [ASCII 문자 = CHAR (수) , Master.dbo.spt_Values ​​ FROM [ISNUMERIC 반환 = ISNUMERIC ('0'+ CHAR (번호) + '0') WHERE 0 255 AND ISNUMERIC BETWEEN 타입 = 'P' AND 번호 ('0' + CHAR (수) + '0') = 1' – RedFilter

+0

감사합니다 @RedFilter, 방금 기사를 복사/붙여 넣기 (사이트에서 볼 필요가 있으므로 사이트에서 보았습니다). 나는 당신의 업데이 트를 통합. – Brad

관련 문제