2011-05-17 14 views
5

मैं गैर-शून्य "मात्रा" (दशमलव) और "स्थिति" (int) कॉलम के साथ एक उत्पाद तालिका है, और मुझे निम्नलिखित मामले अभिव्यक्ति के साथ इस मेज पर एक दृश्य निर्मित:एसक्यूएल व्यू गैर-शून्य तालिका से शून्य कॉलम को घुमाता है?

SELECT P.ProductTypeId, 
     (CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity, 
     ... 
FROM Product P 

ProductTypeId सही ढंग से है गैर-शून्य के रूप में अनुमानित। हालांकि, इस दृश्य के मात्रा कॉलम को शून्य के रूप में अनुमानित किया गया है, भले ही अंतर्निहित कॉलम शून्य नहीं हैं। यह मुझे कोई समझ नहीं आता है।

मैं इस मामले में एक डिफ़ॉल्ट मान प्रदान करने के लिए ISNULL/COALESCE का उपयोग कर सकता हूं और गैर-शून्यता को बल देता हूं, लेकिन कोई सार्थक डिफ़ॉल्ट मान नहीं है, और यह मुझे समझने से पहले स्थान पर नहीं होना चाहिए। कोई विचार क्या चल रहा है?

उत्तर

6

नीचे दी गई स्पष्टीकरण तालिका में computed columns के लिए है। मुझे लगता है कि यह एक दृश्य में गणना कॉलम पर लागू होता है।

डेटाबेस इंजन स्वचालित रूप से अभिकलन कॉलम इस्तेमाल किया भाव के आधार पर की nullability निर्धारित करता है। अधिकांश अभिव्यक्तियों का नतीजा माना जाता है, भले ही केवल गैर-कॉल करने योग्य कॉलम मौजूद हों, क्योंकि संभावित अंडरफ्लो या ओवरफ्लो अच्छी तरह से नल परिणाम उत्पन्न करेंगे। किसी भी किसी तालिका में गणना कॉलम की शून्यता की जांच करने के लिए AllowNull प्रॉपर्टी पर COLUMNPROPERTY फ़ंक्शन का उपयोग करें। एक अभिव्यक्ति है कि नल हो सकता है द्वारा एक nonnullable एक में बदल गया IsNull (check_expression, निरंतर), जहां लगातार एक nonnull मूल्य किसी भी अशक्त परिणाम के लिए प्रतिस्थापित किया है को निर्दिष्ट।

एक उदाहरण है जहाँ आपके अभिव्यक्ति लौट सकते हैं NULL

SET ARITHABORT OFF; 
SET ANSI_WARNINGS OFF; 

WITH Product(Quantity,StatusId) As 
(
SELECT -2147483648,1 
) 
SELECT (CASE WHEN P.StatusId IN (5, 8) THEN 0 ELSE -P.Quantity END) AS Quantity 
FROM Product P 
+0

है और वहाँ है कि इस अतिप्रवाह मामले असंभव है निर्दिष्ट करने के लिए कोई रास्ता नहीं है? – naasking