2012-12-19 7 views
14

में कुल कार्यों में शून्य चेतावनियों को पकड़ना रिकॉर्ड में शून्य मूल्यों को पकड़ने के लिए एसक्यूएल 2008/2012 में डीबगर का उपयोग कैसे करता है?एसक्यूएल

देखें:

drop table abc 

create table abc(
a int 
) 
go 
insert into abc values(1) 
insert into abc values(null) 
insert into abc values(2) 

select max(a) from abc 

(1 row(s) affected) 
Warning: Null value is eliminated by an aggregate or other SET operation. 

अब ऐसा करके rectifed जा सकता है:

SELECT max(isNull(a,0)) FROM abc 

जो ठीक है, जब तक मैं घोंसले के कई स्तरों के साथ 200 लाइन प्रश्नों के लिए आते हैं, और एक परिणाम के सेट 2000 अजीब रिकॉर्ड के। - और उसके बाद कोई संकेत नहीं है कि कॉलम चेतावनी फेंक रहा है।

मैं एसक्यूएल डीबगर में सशर्त ब्रेकपॉइंट्स (या चेतावनी पर तोड़) कैसे जोड़ूं? (अगर यह भी संभव है)

+8

क्यों आप चेतावनी को पकड़ने के लिए की आवश्यकता है के साथ पंक्तियों को अनदेखा कर सकते हैं? एसक्यूएल केवल शून्य मानों को अनदेखा कर देगा, जो आमतौर पर करने के लिए सही काम है। आपके उदाहरण में, यदि आपकी तालिका में '{-1, शून्य, -2}' है, 'अधिकतम (ए)' '-1' लौटाएगा, जबकि' अधिकतम (isnull (a, 0)) '' ' । –

+0

मुझे पता है कि मेरे तर्क को दोबारा जांचने के लिए चेतावनी कहाँ जा रही है/क्यों – Alex

उत्तर

3

भाग 1: के बारे में कुल चेतावनी ...
घोंसला बनाने से मुझे डर है कि वहाँ जो उन चेतावनी ट्रिगर रिकॉर्ड देखने का कोई सीधा रास्ता है कर रहा हूँ अपने कई स्तरों को ध्यान में रखते।

मुझे लगता है कि आपका सबसे अच्छा शॉट प्रत्येक समेकित फ़ंक्शन को एक बार में, शीर्ष-स्तरीय कथन के SELECT भाग से निकालने और क्वेरी चलाने के लिए होगा ताकि आप देख सकें कि कौन सा कुल शीर्ष स्तर पर चेतावनियां पैदा कर रहा है (यदि कोई भी)

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

आप निम्न विधियों को भी नियोजित कर सकते हैं।

भाग 2: सशर्त ब्रेकपॉइंट्स के बारे में ...
डिबगिंग के लिए, आप प्रत्येक नेस्टेड टेबल को बाहर ले जाते हैं और अपना डेटा एक अस्थायी तालिका में डाल देते हैं। इसके बाद आप उस अस्थायी तालिका में शून्य मानों की जांच करें। आपने एक आईएफ स्टेटमेंट में ब्रेकपॉइंट सेट किया है। मेरा मानना ​​है कि यह एक सशर्त ब्रेकपॉइंट के करीब सबसे अच्छी चीज है।(यदि खंड अन्य शर्तों के निर्माण के लिए बदला जा सकता है)

यहाँ एक ठोस उदाहरण है,
इसके बजाय इस बात का :

SELECT A.col1, A.col2, SUM(A.col3) as col3 
FROM (SELECT X as col1, Y as col2, MAX(Z) as col3 
     FROM (SELECT A as X, B as Y, MIN(C) as Z 
      FROM myTableC 
      ) as myTableB 
    ) as myTableA 

कि यह:

SELECT A as X, B as Y, MIN(C) as Z 
INTO #tempTableC 
FROM myTableC 

IF EXISTS (SELECT * 
      FROM #tempTableC 
      WHERE A IS NULL) BEGIN 
    SELECT 'A' --- Breakpoint here 
END 


SELECT X as col1, Y as col2, MAX(Z) as col3 
INTO #tempTableB 
FROM #tempTableC 

IF EXISTS (SELECT * 
      FROM #tempTableB 
      WHERE X IS NULL) BEGIN 
    SELECT 'B' --- Breakpoint here 
END 

SELECT col1, col2, SUM(col3) as col3 
FROM #tempTableB as myTableA 
2

कुल कार्यों परिभाषा के द्वारा शून्य मान बाहर करते हैं, तो आप सिर्फ लिख सकते हैं

select max (a) from abc 

SELECT max(isNull(a,0)) FROM abc 

जब तक एबीसी में एक के सभी मानों अशक्त हैं के बजाय

, जिसमें दूसरी क्वेरी शून्य की बजाय शून्य लौटाएगी।

यदि आप शून्य मान दर्ज किए जाने से रोकना चाहते हैं, तो तालिका कॉलम पर नल बाधा का उपयोग करें।

0

आपको जिस डेटा को आप ढूंढ रहे हैं उसे खींचने के लिए आपको एक दूसरी क्वेरी लिखनी होगी।

SELECT * FROM abc WHERE a IS NULL 

आप इसे एक त्रुटि संदेश लिखने के लिए एक आईएफ कथन में डाल सकते हैं, या किसी तालिका में लॉग इन कर सकते हैं। इसके अलावा, आप भाग्य से बाहर हैं। माफ़ कीजिये। :/

1

आप बंद चेतावनी बदल सकते हैं निष्पादन द्वारा:

set ansi_warnings off 

यह समझाया गया है here। यह कम से कम उन प्रणालियों पर काम करता है, जिन्हें मैंने परीक्षण किया है, नल मानों पर एकत्र करते समय चेतावनी को हटाने के लिए।

यह माना जाता है कि यह संख्यात्मक ओवरफ्लो को परिवर्तित करने और 0 से 0 तक विभाजित करने के बजाय एक त्रुटि के बजाय एक और प्रभाव है। हालांकि, मुझे अभी भी 0 और अंकगणित अतिप्रवाहों के विभाजन के लिए त्रुटियां मिलती हैं।

एक तरफ, SQL सर्वर प्रबंधन स्टूडियो का उपयोग करते समय, कोई शायद ही कभी यह संदेश देखता है। जब क्वेरी सफल होती है, तो संदेश "संदेश" टैब पर होता है। हालांकि, एसएसएमएस "परिणाम" टैब पर चूक जाता है और आमतौर पर संदेशों को देखने का कोई कारण नहीं है (हालांकि चेतावनी वहां है)। क्वेरी में कोई त्रुटि होने पर आप केवल चेतावनी को स्वचालित रूप से देखते हैं, और SSMS संदेश टैब पर डिफ़ॉल्ट होता है।

0

बल्कि आप शून्य मान

SELECT MAX(a) FROM abc WHERE a IS NOT NULL