2013-02-06 11 views
14

मैं पूर्णांक nvarchar कास्ट करने के लिए निम्नलिखित कोड है देखने के लिए जाँच:एसक्यूएल सर्वर - अगर डाली संभव है

 cast(@value as int) 

हालांकि मैं पैरामीटर @value का कोई नियंत्रण नहीं है, इसलिए कोड विफल हो सकता है। क्या यह जांचने के लिए वैसे भी है कि कास्ट करने से पहले एक कास्ट संभव है या नहीं?

उत्तर

21

ठीक है, SQL सर्वर 2012 में आप नए TRY_CAST() का उपयोग कर सकते हैं, लेकिन SQL Server 2008 के साथ, आप ISNUMERIC() का उपयोग करने में सक्षम होना चाहिए, और फिर उन मानों के लिए हैंडलिंग शामिल करें जो उस परीक्षा को पास नहीं करते हैं।

+5

-1: isnumeric ('1।') का चयन करें; कास्ट का चयन करें ('1।'int के रूप में); – Pete

+0

ISNumeric ('a1a') 1 लौटाता है, हालांकि आप कभी भी ('ए 1 ए' फ्लोट के रूप में नहीं डाले जा सकते हैं) – CodingTT

+0

मेरा मानना ​​है कि आपका मतलब SQL सर्वर 2014: https://msdn.microsoft.com/en-us/library/hh974669.aspx –

10

मैंने हाल ही में इस बारे में एक प्रश्न का उत्तर दिया है और ISNUMERIC से CASTINT पर स्वयं काम नहीं करेगा। कारण, ISNUMERIC उदाहरण के लिए गैर पूर्णांक संख्याओं (1.5) के लिए सत्य लौटाता है।

https://stackoverflow.com/a/14692165/1073631

ISNUMERIC साथ CHARINDEX का उपयोग कर एक अतिरिक्त जांच जोड़ने पर विचार करें, या मैं क्या पसंद करते हैं, रेगुलर एक्सप्रेशन का उपयोग डेटा को मान्य करने के:

यहाँ इस विषय पर हाल ही में एक जवाब था।

और यहां एक Fiddle है जो ISNUMERIC का उपयोग करने में समस्या का प्रदर्शन करता है। और Fiddle एक नियमित अभिव्यक्ति का उपयोग करके काम करता है।

DECLARE @Test nvarchar(10) 
SET @Test = '1.5' 
--Works 
SELECT CASE WHEN @Test NOT LIKE '%[^0-9]%' THEN CAST(@Test as int) ELSE 0 END 
-- Produces Error 
SELECT CASE WHEN ISNUMERIC(@Test) = 1 THEN CAST(@Test as int) ELSE 0 END 

शुभकामनाएँ।

+0

+1। । । पहला सही है। आपका उत्तर थोड़ा स्पष्ट होना चाहिए कि दूसरा गलत है (मुझे "उत्पाद त्रुटि" देखने के लिए स्क्रॉल करना होगा)। –

+0

आपको अतिप्रवाहों के खिलाफ भी रक्षा करनी चाहिए (और वैकल्पिक रूप से नकारात्मक पूर्णांक की अनुमति दें): http://stackoverflow.com/a/24250511/1149773 – Douglas

0

उचित परीक्षण है:

select (case when isnumeric(val) = 1 and val not like '%e%' and val not like '%.%' 
      then cast(val as int) 
     end) 

समारोह isnumeric() रिटर्न कुछ भी है कि एक नाव की तरह दिखता है के लिए 1 है, तो आप सावधान रहना होगा।

आप SQL सर्वर की विशिष्टता के रूप में जो भी मानते हैं उसका उपयोग भी कर सकते हैं। आप फ़्लोटिंग वैल्यू 1.23 को int में डाल सकते हैं, लेकिन आप स्ट्रिंग वैल्यू नहीं डाल सकते हैं। तो, निम्नलिखित भी काम करता है:

select (case when isnumeric(val) = 1 
      then cast(cast(val as float) as int) 
     end) 
+1

नहीं, यह गलत है। 'isnumeric ('+') == 1'। 'isnumeric ('-') == 1'। 'आइस्यूमेरिक' एक भयानक कार्यान्वयन है, और उनका उत्तर आपको कई किनारों के मामलों में खुलता है जहां आपकी जांच के बावजूद 'cast' 'int' विफल हो जाएगा। – mattmc3

+0

@ mattmc3। । क्या आपने देखा कि ओपी ने अनिवार्य रूप से यह जवाब स्वीकार कर लिया है। इसके अलावा, 'फ्लोट' में रूपांतरण उन समस्याओं में से कई को हल करता है (हालांकि अतिप्रवाह के साथ नहीं)। –

+0

स्वीकार किए गए उत्तर को SQL 2012+ के लिए TRY_CAST भाग सही हो जाता है। ISNUMERIC का उपयोग करने के लिए, आपको किनारे के मामलों को संभालने के लिए बहुत सारे जिमनास्टिक करना होगा। उदाहरण के लिए, "वैल" के मानों के रूप में '+' या '-' प्लग करें। 'फ्लोट' पर कास्ट शानदार रूप से बम होगा। (^^ मेरा डाउनवोट बीटीडब्ल्यू नहीं - मैं प्रतिनिधि क्षति के लिए टिप्पणी पसंद करता हूं)। यह उत्तर 'ISNUMERIC' का उपयोग करने का एक तरीका देता है जो वास्तव में किनारे के मामलों को संभालता है और यह सुनिश्चित करता है कि आपके पास उचित' TRY_CAST' विकल्प है: http://stackoverflow.com/questions/4522056/how-to-determine-the-field-value -विच-कैन-न-कन्वर्ट-टू-दशमलव-फ्लोट-इंट-i – mattmc3

1

हो सकता है कि हम कुछ इस तरह कर सकते हैं:

declare @value as nvarchar(10) = 'A'; 

begin try 
    select cast(@value as int); 
end try 
begin catch 
-- do something 
end catch 
+0

मुझे यह दृष्टिकोण पसंद है लेकिन हम इसे एक SELECT कथन के अंदर नहीं कर सकते हैं, क्या हम कर सकते हैं? –

2

मैं आम तौर पर निम्न का उपयोग, यह सब स्थितियों को कवर किया जा रहा है।

SELECT CASE WHEN 1 = ISNUMERIC(@value + '.0') THEN CAST(@value as int) ELSE 0 END 

यह तथ्य यह है कि "ISNUMERIC" दो अवधियों अनुमति नहीं दी जाएगी का लाभ लेता है। SQL Server 2012+ में "TRY_CAST" हालांकि एक बेहतर समाधान है।

0

त्रुटियों

यानी

CREATE PROCEDURE p_try_cast 
@type nvarchar(MAX), 
@value nvarchar(MAX) 
AS 
BEGIN 

    BEGIN TRY 
     DECLARE @sql  varchar(MAX) 
     DECLARE @out_table TABLE(value varchar(MAX)) 

     SET @sql = 'SELECT CONVERT(varchar(max), CAST(''' + @value + ''' AS ' + @type + '))' 

     INSERT @out_table 
     EXECUTE (@sql) 

     IF EXISTS (SELECT 1 FROM @out_table WHERE value = @value) 
      RETURN 1 

     RETURN 0 
    END TRY 
    BEGIN CATCH 
     RETURN 0 
    END CATCH 

END 

GO 

को दबाने के लिए एक TRY पकड़ने ब्लॉक के साथ एक प्रक्रिया का उपयोग अब आप कॉल कर सकते हैं स्ट्रिंग पारित और इच्छित प्रकार और proc के साथ देता है कि सफलता के लिए 1 और 0 के लिए विफलता के लिए

DECLARE @ret int 

-- This returns 0 - Fail 
EXEC @ret = p_try_cast 'integer', '1.5' 

-- This returns 1 - Success 
EXEC @ret = p_try_cast 'integer', '1.5' 

-- This returns 0 - Fail 
EXEC @ret = p_try_cast 'char(4)', 'HELLO' 

-- This returns 1 - Success 
EXEC @ret = p_try_cast 'char(4)', 'HELL' 
संबंधित मुद्दे