任何想法爲什麼ISNUMERIC('0D0') = 1
在SQL Server 2008中爲TRUE?爲什麼在SQL Server 2008中將「0D0」視爲數字?
我正在驗證來自另一個系統的ID號碼,該號碼有時包含我們不希望帶過來的字母,但是這個組合會跳過代碼(它認爲數字的特定ID是「005406257D6」) 。下游我們正在做CONVERT(BIGINT, @val)
,當它找到這些「D」值時顯然會窒息。
我打了什麼特殊情況,我該如何解釋它?
任何想法爲什麼ISNUMERIC('0D0') = 1
在SQL Server 2008中爲TRUE?爲什麼在SQL Server 2008中將「0D0」視爲數字?
我正在驗證來自另一個系統的ID號碼,該號碼有時包含我們不希望帶過來的字母,但是這個組合會跳過代碼(它認爲數字的特定ID是「005406257D6」) 。下游我們正在做CONVERT(BIGINT, @val)
,當它找到這些「D」值時顯然會窒息。
我打了什麼特殊情況,我該如何解釋它?
基本上,IsNumeric是無用的 - 所有它驗證的是該字符串可以轉換爲任何的數字類型。在這種情況下,「0D0」可以轉換爲浮點數。 (我不記得的原因,但有效「d」是「E」的代名詞,並意味着它是科學記數法):
select CONVERT(float,'2D3')
如果您想驗證這只是數字,然後not @val like '%[^0-9]%'
將是一個更好的測試。您還可以通過添加長度檢查來進一步改進。
一個很好的解釋,爲什麼。
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 ¥
其實應該是'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
感謝@RedFilter,我只是從文章中複製/粘貼(因爲該網站需要註冊才能查看它)。我整合了你的更新。 – Brad 2010-12-13 15:58:57
+1 - 看起來它也適用於 'E',而不是AC(所以它不是HEX的東西)... – JNK 2010-12-13 15:41:42
另請參見http://stackoverflow.com/questions/2358147/best-equivalent-for-isinteger-in-sql-server由gbn的答案是有趣的,值得一試IMO .. – 2010-12-13 15:47:55
@JNK afaik「D」代表十進制。 – 2010-12-13 15:48:26