2010-12-13 22 views
7

कोई विचार क्यों ISNUMERIC('0D0') = 1 SQL Server 2008 में सत्य है?SQL Server 2008 में "0D0" संख्यात्मक क्यों माना जाता है?

मैं किसी अन्य सिस्टम से आईडी नंबरों को मान्य कर रहा हूं, जिसमें कभी-कभी ऐसे अक्षर होते हैं जिन्हें हम नहीं लेना चाहते हैं, लेकिन यह संयोजन कोड को ट्रिप कर रहा है (विशिष्ट आईडी जो यह सोचती है कि संख्यात्मक है "005406257D6") । डाउनस्ट्रीम हम CONVERT(BIGINT, @val) कर रहे हैं, जो स्पष्ट रूप से चौंकाने वाला है जब यह इन "डी" मानों को पाता है।

मैं किस विशेष मामले में मार रहा हूं, और मैं इसके लिए कैसे खाता हूं?

+0

+1 - ऐसा लगता है कि यह भी 'ई' के लिए काम करता है, लेकिन के लिए नहीं एसी (इसलिए यह एक हेक्स चीज नहीं है) ... – JNK

+0

यह भी देखें http://stackoverflow.com/questions/2358147/best-equivalent-for-isinteger-in-sql- सर्वर जीबीएन द्वारा उत्तर दिलचस्प है और कोशिश करने लायक है आईएमओ .. –

+0

@ जेएनके afaik "डी" दशमलव के लिए खड़ा है। –

उत्तर

11

असल में, IsNumeric बेकार है - यह सब सत्यापित करता है कि स्ट्रिंग को संख्यात्मक प्रकारों के में परिवर्तित किया जा सकता है। इस मामले में, "0 डी 0" को एक फ्लोट में परिवर्तित किया जा सकता है। (मैं कारण याद कर सकते हैं नहीं है, लेकिन प्रभावी ढंग से 'डी' 'ई' के लिए एक पर्याय वैज्ञानिक संकेतन है, और यह है का मतलब है):

select CONVERT(float,'2D3') 

आपको यह सत्यापित करना चाहते हैं कि यह सिर्फ अंक है, तो not @val like '%[^0-9]%' एक बेहतर परीक्षण होगा। आप लम्बाई चेक जोड़कर इसे और भी सुधार सकते हैं।

+0

दरअसल "0 डी 0" LIKE '% [^ 0-9]%' सत्य भी है, लेकिन मैं आपका बिंदु देखता हूं। – gfrizzle

+0

@gfrizzle - आपने –

+0

@gfrizzle की शुरुआत में 'नहीं' को याद किया - आपको उस अभिव्यक्ति पर 'पसंद नहीं' करने की आवश्यकता है क्योंकि इसकी शुरुआत में '^' है। अर्थात। आप पूछ रहे हैं "क्या यह सभी संख्या नहीं है?" – JNK

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

असल में, यह 'चयन [असीसी कोड] = एसटीआर (संख्या), [असीसी कैरेक्टर] = चार्ज (संख्या), [ISNUMERIC रिटर्न] = ISNUMERIC (CHAR (संख्या)) मास्टर.dbo से होना चाहिए। spt_Values ​​ कहां प्रकार = 0 और 255 के और ISNUMERIC (CHAR (संख्या)) = 1 के बीच 'पी' और संख्या संघ का चयन करें [Ascii कोड] = एसटीआर (संख्या), [ASCII वर्ण] = CHAR (संख्या) , [ISNUMERIC रिटर्न] = ISNUMERIC ('0' + CHAR (संख्या) '0' +) Master.dbo.spt_Values ​​ से कहां प्रकार = 'पी' और 0 और 255 के और ISNUMERIC के बीच संख्या ('0' + चार्ज (संख्या) + '0') = 1' – RedFilter

+0

धन्यवाद @RedFilter, मैंने अभी आलेख से कॉपी/पेस्ट किया है (चूंकि साइट को इसे देखने के लिए पंजीकरण की आवश्यकता है)। मैंने आपके अपडेट को शामिल किया। – Brad

संबंधित मुद्दे