2011-06-08 6 views
5

मेरे पास एक तालिका में एक वर्चर कॉलम है जहां मैं उसी डेटा में अपना डेटा दूसरे कॉलम में डालना चाहता हूं जहां इसका डेटा प्रकार धन है। स्रोत कॉलम में से कुछ मान बड़ी संख्या में हैं जिन्हें मैं अनदेखा करना चाहता हूं और बस इन मानों को न्यूल पर सेट करना चाहता हूं।SQL अद्यतन के दौरान पिछले कास्टिंग त्रुटियों को छोड़ने और जारी रखने का सबसे अच्छा तरीका क्या है?

मैं इस कोशिश की:

UPDATE MyTable SET destCol = CASE WHEN IsNumeric(sourceCol) = 1 THEN sourceCol END 

लेकिन यह एक 'अंकगणित अतिप्रवाह त्रुटि ... को फेंक देता है, जब यह बड़ी संख्या परीक्षण करने के लिए कोशिश करता है।

मुझे लगता है कि मुझे किसी प्रकार की फ़ंक्शन की आवश्यकता हो सकती है या इच्छित कार्यक्षमता प्राप्त करने के लिए संग्रहीत प्रक्रिया में प्रयास/पकड़ ब्लॉक का उपयोग करना पड़ सकता है।

अद्यतन

मैं स्रोत स्तंभ में मानों में से कुछ का उल्लेख पाठ मान कि सभी पैसे में परिवर्तित नहीं किया जा सकता है भूल गया, इन के साथ-साथ शून्य पर सेट करने की आवश्यकता होगी।

उत्तर

2

समस्या बड़ी संख्या के कारण होता है, तो आप उन है कि money

UPDATE MyTable 
SET destCol = CAST(sourceCol AS money) 
WHERE sourceCol < 922337203685477.5807 

money श्रृंखला के लिए convertable हैं सीमित कर सकते हैं -922,337,203,685,477.5808 से 922,337,203,685,477.5807

[संपादित करें]

के लिए पैसे है

तो आपके पास वर्कर कॉलम है। मान लिया जाये कि तुम सिर्फ साधारण संख्या है, तो कुछ इस तरह परिवर्तित करना चाहते हैं

UPDATE MyTable 
SET destCol = 
    CASE WHEN Len(sourceCol) < 15 AND ISNUMERIC(sourceCol) = 1 THEN CAST(sourceCol AS MONEY) ELSE 0 END 
+0

यह काम करेगा यदि यह सभी संख्याएं थी, लेकिन मैं उल्लेख करना भूल गया कि कुछ स्रोत मान टेक्स्ट हैं जिन्हें पैसे में परिवर्तित नहीं किया जा सकता है, अद्यतन देखें। – Crackerjack

+0

@ क्रैकरजेक - क्या यह काम करता है? –

+0

'ISNUMERIC (' 1d2 ') का चयन करें; CAST का चयन करें ('1 डी 2' पैसे के रूप में) '- परिणामस्वरूप '1' में त्रुटि के बाद त्रुटि। मैं हमेशा 'ISNUMERIC' के लिए सबसे बेकार कार्य होने के लिए वोट दूंगा ... –

1

:

UPDATE MyTable SET destCol = CASE WHEN not sourceCol like '%[^0-9]%' and LEN(sourceCol) <= 8 THEN sourceCol END 

यह अप करने के लिए 8 अंक के किसी भी तार के साथ destCol अद्यतन करने का प्रयास करेंगे आप कुछ इस तरह कर सकते हैं। यदि आपको मुद्रा प्रतीकों या हजारों या दशमलव विभाजकों को अनुमति देने की आवश्यकता है, तो आपको उन्हें LIKE अभिव्यक्ति में भी शामिल करना होगा।

समस्या, हमेशा के रूप में, ISNUMERIC के साथ समस्या यह एक प्रश्न का उत्तर देती है कि किसी भी चीज़ के लिए कोई उपयोगी उपयोग नहीं किया जा सकता है (क्या यह स्ट्रिंग किसी भी संख्यात्मक प्रकार में परिवर्तित हो सकती है?), कुछ उपयोगी के बजाय (क्या यह स्ट्रिंग परिवर्तित हो सकती है संख्यात्मक प्रकार 'एक्स' के लिए?)

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

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