2010-12-13 23 views
7

任何想法爲什麼ISNUMERIC('0D0') = 1在SQL Server 2008中爲TRUE?爲什麼在SQL Server 2008中將「0D0」視爲數字?

我正在驗證來自另一個系統的ID號碼,該號碼有時包含我們不希望帶過來的字母,但是這個組合會跳過代碼(它認爲數字的特定ID是「005406257D6」) 。下游我們正在做CONVERT(BIGINT, @val),當它找到這些「D」值時顯然會窒息。

我打了什麼特殊情況,我該如何解釋它?

+0

+1 - 看起來它也適用於 'E',而不是AC(所以它不是HEX的東西)... – JNK 2010-12-13 15:41:42

+0

另請參見http://stackoverflow.com/questions/2358147/best-equivalent-for-isinteger-in-sql-server由gbn的答案是有趣的,值得一試IMO .. – 2010-12-13 15:47:55

+0

@JNK afaik「D」代表十進制。 – 2010-12-13 15:48:26

回答

11

基本上,IsNumeric是無用的 - 所有它驗證的是該字符串可以轉換爲任何的數字類型。在這種情況下,「0D0」可以轉換爲浮點數。 (我不記得的原因,但有效「d」是「E」的代名詞,並意味着它是科學記數法):

select CONVERT(float,'2D3') 

如果您想驗證這只是數字,然後not @val like '%[^0-9]%'將是一個更好的測試。您還可以通過添加長度檢查來進一步改進。

+0

實際上,「0D0」LIKE'%[^ 0-9]%'也是TRUE,但我明白了你的觀點。 – gfrizzle 2010-12-13 15:46:16

+0

@gfrizzle - 你在開始時錯過了'not' – 2010-12-13 15:47:41

+0

@gfrizzle - 你需要在該表達式上做一個'NOT LIKE',因爲它在開頭有'^'表示NOT。即你問:「難道不是所有的數字?」 – JNK 2010-12-13 15:48:40

0

一個很好的解釋,爲什麼。

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

其實應該是'SELECT [Ascii Code] = STR(Number), [Ascii Character] = CHAR(Number), [ISNUMERIC Returns] = ISNUMERIC(CHAR(Number)) FROM Master.dbo。 spt_Values WHERE類型= 'P' 和號碼0和255之間 AND ISNUMERIC(CHAR(數目))= 1 工會 SELECT [ASCII代碼] = STR(號碼), [ASCII字符] = CHAR(號碼) , [ISNUMERIC返回] = ISNUMERIC( '0' + CHAR(數量)+ '0') FROM Master.dbo.spt_Values WHERE類型= 'P' 和號碼0和255之間 AND ISNUMERIC( '0' + CHAR(數字)+'0')= 1' – RedFilter 2010-12-13 15:52:58

+0

感謝@RedFilter,我只是從文章中複製/粘貼(因爲該網站需要註冊才能查看它)。我整合了你的更新。 – Brad 2010-12-13 15:58:57

相關問題