2012-03-12 11 views
5

मेरे पास एक जटिल डेटा दृश्य है जो जानकारी को दोबारा जोड़ता है और सारांशित करता है।मैं डेटा व्यू के भीतर से 'अंकगणित ओवरफ़्लो' से संबंधित त्रुटियों को कैसे अनदेखा कर सकता हूं?

प्रत्येक रात एक निर्धारित कार्य एक संग्रहित प्रक्रिया चलाता है जो डेटा दृश्य से सभी डेटा का चयन करता है, और इसे एक तालिका में सम्मिलित करता है ताकि उपयोगकर्ता डेटा पर एक चयनित कथन चलाने से डेटा को क्वेरी और विश्लेषण कर सकें राय।

अभिभावक तालिका में कुछ सौ हजार रिकॉर्ड होते हैं और निर्यात से सेट परिणाम आकार में 1,000,000 से अधिक रिकॉर्ड होते हैं।

अधिकांश रातों के लिए निर्यात प्रक्रिया किसी भी परेशानी के बिना काम करती है, हालांकि, यदि कोई उपयोगकर्ता हमारे मास्टर ईआरपी सिस्टम के भीतर गलत मान डालता है, तो यह रात की प्रक्रिया को दुर्घटनाग्रस्त कर देगा क्योंकि दशमलव फ़ील्ड में से एक में एक मान होगा मुझे कुछ रूपांतरणों के भीतर फिट करना है जो मुझे डेटा पर बनाना है। विशिष्ट, ग़लत क्षेत्र को डिबग करना और ढूंढना बहुत कठिन और समय लेने वाला हो सकता है।

इसके साथ, मैंने दो SQL सेटिंग्स NUMERIC_ROUNDABORT और ARITHABORT के बारे में पढ़ा है। ये मेरी समस्या को हल करने के लिए सही विकल्प की तरह लगता है, हालांकि, मैं उन्हें अपने डेटा व्यू या संग्रहीत प्रक्रिया के साथ काम करने के लिए प्रतीत नहीं कर सकता।

मेरी संग्रहीत प्रक्रिया एक ट्रंकेट और INSERT कथन से अधिक कुछ नहीं है। मैंने जोड़ा ...

SET NUMERIC_ROUNDABORT OFF 
SET ARITHABORT OFF 

... एसपी की शुरुआत में और इससे मदद नहीं मिली। मुझे लगता है कि ऐसा इसलिए है क्योंकि डेटा तकनीकी दृष्टि से जुड़े कोड के भीतर तकनीकी रूप से त्रुटि हो रही है।

अगला, मैंने डेटा व्यू में दो विस्तारित गुण जोड़ने की कोशिश की, उम्मीद है कि यह काम करेगा। ऐसा नहीं हुआ

क्या कोई तरीका है कि मैं इन SQL गुणों को गोल करने वाली त्रुटियों को अनदेखा करने के लिए सेट कर सकता हूं ताकि मैं अपने डेटा दृश्य से अपना डेटा निर्यात कर सकूं?

मैं ज्यादातर लोगों के लिए जानता हूं, एसओ उत्तरदाताओं के रूप में, हमारा पहला झुकाव कोड मांगना है। इस मामले में, हालांकि, कोड बेहद जटिल और स्वामित्व दोनों है। मैं उन परिभाषाओं को ठीक करने के बारे में जानता हूं जो कभी-कभी अतिप्रवाह सबसे आदर्श समाधान है, लेकिन इस परिस्थिति में, इन प्रकार की त्रुटियों को अनदेखा करना अधिक कुशल है क्योंकि वे इस तरह के दुर्लभ आधार पर होते हैं और समस्या निवारण के लिए बहुत मुश्किल होते हैं।

इस व्यवहार को अनदेखा करने के लिए मैं क्या कर सकता हूं?

अद्यतन

संयोग से, मेरा मानना ​​है कि मैं इस मुद्दे की जड़ पाया है हो सकता है, फिर भी, मुझे पता नहीं क्यों यह होने वाली की जाएगी है। यह अभी से नहीं बना है।

मेरी तालिका दृश्य के माध्यम से, मेरे पास विभिन्न फ़ील्ड हैं जिनकी गणना की जाती है। चूंकि इन क्षेत्रों को तालिका में फ़ील्ड में फिट करने की आवश्यकता है जिन्हें decimal (12, 5) के रूप में परिभाषित किया गया है, इसलिए मैं हमेशा CAST(... AS DECIMAL(12, 5)) खंडों में दृश्य फ़ील्ड स्टेटमेंट को लपेटता हूं।

मौका से, मैं एक विषमता पर ठोकर खाई। मैंने यह देखने का फैसला किया कि कैसे एसएसएमएस ने मेरे डेटा व्यू को देखा "। एसएसएमएस ऑब्जेक्ट एक्सप्लोरर में, मैंने दृश्य -> ​​[मेरा दृश्य]-कॉलम अनुभाग का विस्तार किया और मैंने देखा कि फ़ील्ड में से एक को decimal (13, 5) के रूप में परिभाषित किया गया था।

मुझे लगता है कि मैंने अपने कास्टिंग बयान में से एक में गलती की होगी लेकिन तालिका दृश्य के लिए कोड भरने के बाद, decimal(13, 5) फ़ील्ड के लिए कोई परिभाषा नहीं है ?! मेरा एकमात्र अनुमान यह है कि एसएसएमएस दृश्य क्षेत्र के बारे में परिभाषा को परिणामी डेटा से लिया जाना चाहिए। हालांकि, मुझे कोई संकेत नहीं है कि यह कैसे हो सकता है क्योंकि प्रत्येक फ़ील्ड decimal(12, 5) पर है।

मैं जानना चाहता हूं कि यह क्यों हो रहा है, लेकिन फिर, मेरा मूल प्रश्न अभी भी खड़ा है। तालिका तालिका पर मैं कैसे और किस एसईटी कथन को परिभाषित कर सकता हूं जो आपके सभी अंकगणित अतिप्रवाहों को अनदेखा कर देगा और गलत डेटा वाले फ़ील्ड में शून्य मूल्य लिखेंगे?

अंतिम टिप्पणियाँ

मैं जवाब के रूप में HeavenCore की प्रतिक्रिया में चिह्नित किया है, क्योंकि यह मेरे सवाल को संबोधित करता है लेकिन यह मेरी मूल समस्या हल नहीं किया गया है।

कुछ समस्या निवारण और काम पर मेरा निर्यात प्राप्त करने का प्रयास करने के प्रयासों के बाद, मुझे एक अलग दृष्टिकोण की कोशिश करनी होगी। मैं अभी भी निर्यात करने के लिए निर्यात नहीं कर सकता, भले ही मैं NUMERIC_ROUNDABORT और ARITHABORT गुण OFF पर सेट करता हूं।

+0

यह मान हो रहा हो करने के लिए एक अलग डेटा प्रकार के लिए डाली हो रही किया जाना चाहिए जिसमें से यह संग्रहीत किया जाता है सही किया? मान लीजिए यह मामला है, डालने के स्तर पर कास्टिंग किया जा रहा है या सम्मिलित स्तर से पहले चयन किया जा रहा है? उदाहरण के लिए - यदि आप वहां से कुछ दुष्ट डेटा के साथ मैन्युअल रूप से इसे चुनते हैं तो एक त्रुटि उत्पन्न करने वाला दृश्य है? (उदाहरण के लिए, क्या आप दृश्य के भीतर एक आईएनटी में कॉलम कास्टिंग कर रहे हैं - सम्मिलित होने के विपरीत ओवरफ़्लो हो सकता है?) - यदि दृश्य ठीक से चयन करता है, तो आप अपने INSERT को संशोधित कर सकते हैं ... LEN के आधार पर कुछ मानों को बाहर करने के लिए चयन कथन()? – HeavenCore

+0

त्रुटि तब होती है जब आप डेटा दृश्य से डेटा चुनते हैं। डेटा व्यू के भीतर कास्ट स्टेटमेंट्स हैं। यह कास्टिंग अनिवार्य है और क्षेत्र के लिए सभी अंकगणितीय होने के बाद होता है। – RLH

+0

यदि आप अभी के लिए दृश्य को अनदेखा करते हैं और 'SET NUMERIC_ROUNDABORT OFF' और' सेट एरिथैबर्ट ऑफ़ 'सेट के साथ मैन्युअल रूप से दृश्य विवरण को चलाते हैं, तो क्या क्वेरी काम करती है? (ध्यान दें कि जब आप कोई नई क्वेरी विंडो खोलते हैं तो एसएसएमएस इन सेटिंग्स को अदृश्य रूप से सेट करता है, एसएसएमएस विकल्प जांचें) – HeavenCore

उत्तर

4

मुझे लगता है कि ARITHABORT आपका मित्र यहां है।

उदाहरण के लिए, का उपयोग कर SET ARITHABORT OFF & SET ANSI_WARNINGS OFF मूल्यों यह (फेंक अपवाद के बजाय)

यहाँ कास्ट करने के लिए विफल रहता है नल होगा एक त्वरित उदाहरण है:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[tbl_OverflowExample](
    [Value] [decimal](12, 2) NULL 
) ON [PRIMARY]  
GO 
INSERT [dbo].[tbl_OverflowExample] ([Value]) VALUES (CAST(9999999999.00 AS Decimal(12, 2))) 
GO 
INSERT [dbo].[tbl_OverflowExample] ([Value]) VALUES (CAST(1.10 AS Decimal(12, 2))) 
GO 

--#### Select data without any casting - works 
SELECT VALUE 
FROM dbo.tbl_OverflowExample 

--#### With ARITHABORT and ANSI warnings disabled - Returns NULL for 999999 but 1.10 as expected 
SET ARITHABORT OFF; 
SET ANSI_WARNINGS OFF; 
SELECT CONVERT(DECIMAL(3, 2), VALUE) 
FROM dbo.tbl_OverflowExample 
GO 

--#### With defaults - Fails with overflow exception 
SET ARITHABORT ON; 
SET ANSI_WARNINGS ON; 
SELECT CONVERT(DECIMAL(2, 2), VALUE) 
FROM dbo.tbl_OverflowExample 

निजी तौर पर हालांकि - मैं करना पसंद करते हैं दृश्य को डीबग करें और कथन NULL वापस करने के लिए बयान दें यदि अंतर्निहित मान लक्ष्य डेटा प्रकार से अधिक है - इससे यह सुनिश्चित होगा कि दृश्य कनेक्शन विकल्पों के बावजूद दृश्य कार्य करता है।

संपादित करें: कुछ तथ्यात्मक त्रुटियों

+0

क्या आप "इन सेटिंग्स का उपयोग करने के मामले में बस" अनुभाग जोड़ सकते हैं? मेरी समस्या यह है कि मैं एक दृश्य के भीतर 'एसईटी' कथन को परिभाषित करने का तरीका नहीं समझ सकता। हाँ आप सही हैं। फर्जी फ़ील्ड एक पूर्ण मूल्य लौटाएंगे। लेकिन इस डेटा के मामले में, यह महत्वपूर्ण है कि यह हर दिन उपलब्ध हो लेकिन यह डेटा अधिकतर करीबी अनुमानों के लिए उपयोग किया जाता है और 1,000,000 लौटा रिकॉर्ड के साथ, यह ठीक है अगर कुछ हफ्तों के लिए 1 कुछ गलत है, तो कुछ ही महीनों में। – RLH

+0

आप कहते हैं कि चयन से सम्मिलित एक निर्धारित कार्य से चलाया गया है?EXEC कमांड चलाने से पहले आपको 'SET ARITHABORT OFF;' और 'सेट ANSI_WARNINGS OFF' कॉल करने के लिए केवल कार्य को संशोधित करने की आवश्यकता होगी। एसक्यूएल सर्वर एजेंट नौकरी मानते हुए, आपके पास निम्नानुसार 1 कदम होगा: 'सेट एरिथबॉर्ट ऑफ़; सेट ANSI_ चेतावनी बंद; EXEC usp_Whatever; ' – HeavenCore

+0

इसके अलावा, मैंने आपके कई सुझावों का प्रयास किया है। समस्या यह है कि मैं आमतौर पर विशिष्ट पंक्ति को विफल कर सकता हूं जो विफल रहता है लेकिन मुझे गणित में असफल बिंदु या आवश्यक कॉलम नहीं मिल रहा है। इस विचार में बहुत से सूत्र और कलाकार बयान हैं। कई कास्ट स्टेटमेंट इस प्रकार की चीज़ को अभी तक होने से रोकने के लिए हैं, फिर भी, यह हर 6 महीने में लगभग एक बार बढ़ता है। समस्या पंक्ति ढूंढना, और इसे ठीक करने में एक पूर्ण दिन लग सकता है, और अंतर्निहित डेटा को ठीक करना महत्वपूर्ण नहीं है। यही कारण है कि यदि संभव हो तो मैं इन त्रुटियों को अनदेखा करना पसंद करूंगा। – RLH

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

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