2008-12-01 7 views
31

यहसंग्रहित प्रक्रिया SQL सर्वर पर पैरामीटर के रूप में NULL को कैसे प्रतिबंधित करें?

CREATE PROCEDURE Dummy 
    @ID INT NOT NULL 
AS 
BEGIN 
END 

क्यों यह कुछ इस तरह करने के लिए संभव नहीं है के रूप में एक संग्रहीत प्रक्रिया बनाने के लिए संभव है?

उत्तर

-7

पैरामीटर सत्यापन वर्तमान में SQL सर्वर में प्रक्रियात्मक तर्क की एक विशेषता नहीं है, और न्यूल न केवल एक संभावित प्रकार का डेटा सत्यापन है। एक तालिका में CHAR डेटाटाइप लंबाई लंबाई विनिर्देश है। क्या इसे भी लागू किया जाना चाहिए? और आप अपवादों को कैसे संभालेंगे? टेबल स्कीमा में अपवाद हैंडलिंग के लिए एक व्यापक, अत्यधिक विकसित और कुछ हद तक मानक-आधारित पद्धति है; लेकिन प्रक्रियात्मक तर्क के लिए नहीं, शायद इसलिए प्रक्रियात्मक तर्क को संबंध प्रणाली से परिभाषित किया गया है। दूसरी तरफ, संग्रहीत प्रक्रियाओं में पहले से ही कई घटनाओं और भाषाओं में बंधे त्रुटि घटनाओं को बढ़ाने के लिए एक मौजूदा तंत्र है। पैरामीटर पर घोषणात्मक डेटा प्रकार की बाधाओं के लिए ऐसा कोई समर्थन नहीं है। इसे जोड़ने का प्रभाव व्यापक है; विशेष रूप से, क्योंकि यह अच्छी तरह से समर्थित है, और एक्स्टेंसिबल है, बस कोड जोड़ने के लिए:

IF ISNULL(@param) THEN 
    raise error .... 
END IF 

एक संग्रहीत प्रक्रिया के संदर्भ में शून्य की अवधारणा भी नहीं अच्छी तरह से परिभाषित किया गया है विशेष रूप से एक मेज के संदर्भ या की तुलना में एक एसक्यूएल अभिव्यक्ति। और यह माइक्रोसॉफ्ट की परिभाषा नहीं है। एसक्यूएल मानकों के समूहों ने बहुत सारे वर्षों में बहुत सारे साहित्य पैदा किए हैं जो न्यूल के व्यवहार की स्थापना करते हैं और उस व्यवहार के लिए परिभाषाओं की सीमाओं को स्थापित करते हैं। और संग्रहित प्रक्रिया उनमें से एक नहीं है।

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

एक कारण संग्रहीत प्रक्रियाओं को सी # कार्यों के रूप में नहीं लिखा गया है।

+43

* "यह क्यों संभव होना चाहिए" * - उम्म्म ... क्योंकि यह 'CREATE तालिका' कथन में एक बहुत ही सामान्य रूप से उपयोग किया जाने वाला शॉर्टकट है, इसलिए * प्रक्रिया बनाने के लिए इसे * नहीं * असंगत है? एसक्यूएल सर्वर के लिए पैरामीटर कॉलम के लिए सटीक तरीके से शून्य के पैरामीटर को जांचना कितना मुश्किल होगा? –

+0

डेटाटाइप का 'न्यूल' _is_ हिस्सा।इसके बारे में सोचें 'शून्य' बनाम 'गैर-शून्य' बनाम। एक ऐसा प्रकार है जिसमें सभी 'मानक' मान होते हैं, और इसमें एक विशेष नल केस मान भी शामिल है। दूसरे में केवल 'मानक' मान होते हैं। दो प्रकार एक ही अंतर्निहित मूल्यों पर आधारित होते हैं, लेकिन एक विशेष मामले की आपूर्ति करता है। –

+0

नहीं NULL डेटा प्रकार का हिस्सा नहीं है। यह एक तालिका के लिए कॉलम परिभाषा का हिस्सा है। नल टाइपलेस है। आप इस तरह की अवधारणा नहीं हैं जैसे नल इंटेगर या नल वर्चर। हां, यह तालिका में कॉलम लगाने के लिए डीडीएल का हिस्सा है। तो DEFAULT है, और इसलिए सूचकांक और विदेशी कुंजी परिभाषाएं हैं। क्या हम कह रहे हैं कि संग्रहीत प्रक्रिया मानकों को टेबल कॉलम के साथ ऑर्थोगोनल माना जाना चाहिए? – dkretz

39

कॉलिंग स्थान पर राज्य की रिपोर्ट करने के लिए आप स्पोक में अपनी नल-नेस और RAISERROR की जांच कर सकते हैं।

CREATE proc dbo.CheckForNull @i int 
as 
begin 
    if @i is null 
    raiserror('The value for @i should not be null', 15, 1) -- with log 

end 
GO 

फिर फोन:

exec dbo.CheckForNull @i = 1 

या

exec dbo.CheckForNull @i = null 
+0

किसी को उम्मीद है कि त्रुटि संदेश के लिए वैकल्पिक पैरामीटर नाम स्वीकार करने के लिए इस उत्तर को अपडेट किया जाएगा, सभी सामान्य प्रकारों को स्वीकार करें (bigint, varchar, ..., और केवल तभी उठाएं जब वे सभी शून्य हो जाएं)। – crokusek

10

आपका कोड, सही समझदार और यहां तक ​​कि अच्छी आदत है। आपको बस SQL Server 2014 के लिए प्रतीक्षा करने की आवश्यकता है जो इस तरह के वाक्यविन्यास का समर्थन करता है।

आखिरकार, जब आप समय संकलित कर सकते हैं तो रनटाइम पर क्यों पकड़ें?

this msdn document भी देखें और वहां Natively Compiled खोजें।

जैसा कि dkrez कहते हैं, nullabiliy डेटा प्रकार परिभाषा का हिस्सा नहीं माना जाता है। मुझे अभी भी आश्चर्य है क्यों नहीं।

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