2012-08-08 12 views
5

मैं देख रहा हूँ कि जब मैं इस कथन का उपयोग, Action स्तंभ नल नहीं है के लिए SELECT जांच में nullability नियंत्रित करने के लिए कैसे:शाब्दिक आधारित कॉलम

SELECT TOP 0 SerialNumber, 0 [Action] INTO #MyTable FROM FSE_SerialNumber 

लेकिन जब मैं इस बयान का उपयोग करें, Action स्तंभ है नल:

SELECT TOP 0 SerialNumber, CAST(0 as int) [Action] INTO #MyTable FROM FSE_SerialNumber 

तालिका इस तरह से है, क्योंकि मैं अस्थायी तालिका सर्वर डिफ़ॉल्ट मिलान या कहीं और से serialnumber का मिलान वारिस नहीं करना चाहते बनाने के लिए मेरे कारण। मैं इसे FSE_SerialNumber..SerialNumber के संयोजन से मेल खाना चाहता हूं।

मेरा सवाल है, क्या मैं कास्ट फ़ंक्शन पर भरोसा कर सकता हूं जो मुझे एक नामुमकिन कॉलम दे रहा है, या यह स्पष्ट रूप से परिभाषित नहीं है और बदल सकता है। कास्ट अचानक कॉलम को निरर्थक क्यों बनाता है? क्या यह स्पष्ट करने के लिए एक बेहतर तरीका है (टिप्पणियों के अलावा) कि मेरा इरादा वहां एक निरर्थक कॉलम प्राप्त करना है?

+0

मुझे नहीं पता कि यह दस्तावेज है, लेकिन कहीं और मैंने एक शून्य से कॉलम बनाने के लिए एक शाब्दिक के बजाय एक चर का उपयोग करने की तकनीक भी देखी है।मुझे लगता है कि ऐसा इसलिए है क्योंकि परिवर्तनीय (आपकी अभिव्यक्ति की तरह) में एक संरचना है जिसका मेटाडाटा एनयूएलएल को अनुमति देता है, इसलिए नया कॉलम भी करता है। और यदि आपने अपना वैरिएबल @NullableInt नाम दिया है जो आपके स्वयं-दस्तावेज़ समस्या को संभाल सकता है। – GilM

उत्तर

5

ऐसा लगता है कि एक निश्चित उत्तर here है। यहां कॉपी कर रहा है:

मेटाडाटा स्रोत कॉलम के आधार पर निर्धारित किया गया है और चयन सूची में का उपयोग किया गया है। नीचे नियम हैं:

  1. निर्मित एक तरह SUBSTRING, बाएँ, दाएँ आदि (IsNull को छोड़कर), उदाहरण के लिए नल के रूप में इंजन द्वारा माना जाता है समारोह का उपयोग करता है किसी भी अभिव्यक्ति। तो अगर आप कास्ट का उपयोग करें (चार के रूप में somecol (8)) तो अभिव्यक्ति नल

  2. Literals, स्थिरांक, @@ DBTS की तरह वैश्विक चर, @@ त्रुटि आदि माना जाता है गैर-व्यर्थ है क्योंकि वे कुछ मूल्य हमेशा वापसी

  3. तो अभिव्यक्ति एक स्तंभ तो nullability स्रोत स्तंभ मेटाडाटा से ली गई है

    तो चयन सूची में एक अभिव्यक्ति या स्तंभ बनाने के लिए अशक्त तो स्तंभ या अभिव्यक्ति के आसपास IsNull का उपयोग नहीं है।

तो, ऐसा लगता है कि आप अपनी कास्ट अभिव्यक्ति का उपयोग करने के लिए सुरक्षित कर रहे हैं।

0

व्यक्तिगत रूप से, सर्वोत्तम नियंत्रण के लिए, आपको अपनी तालिका पहले बनाना चाहिए। उदाहरण के लिए:

Create Table #MyTable (
    SerialNumber int Not Null, -- or however this is correctly defined. 
    Action int Null 
) 

फिर, ऐसा एक सम्मिलित में ... से का चयन करें ...

Insert Into #MyTable(SerialNumber, Action) 
Select SerialNumber, 0 
From FSE_SerialNumber 

फिर, क्या क्षेत्रों होना चाहिए का सवाल ही नहीं हो जाएगा।

मुझे पता है कि यह काफी नहीं है जो आपने पूछा था, लेकिन यह कुछ विचार करने के लिए हो सकता है।

+0

इसके साथ समस्या तब है जब SerialNumber कॉलम के संयोजन को अस्थायी तालिका में कॉपी करने के लिए कोई सीधा तरीका नहीं है। मैं इसे अपना रास्ता कर रहा था और उसे टक्कर की समस्याओं के कारण बदलना पड़ा। – BlueMonkMN

+0

@ ब्लूमोन्कएमएन। मुझे खुशी है कि आपको एक उपयुक्त समाधान मिला है, और आप वास्तव में सही हैं कि तालिका बनाने के दौरान आप संयोजन को _copy_ नहीं कर सकते हैं, लेकिन आप इसे स्पष्ट रूप से तालिका विवरण (भविष्य के संदर्भ के लिए) में आपूर्ति कर सकते हैं। – Jim

0

SELECT ... INTO के लिए त्वरित सामान्य संकेत: कॉलम के साथ ISNULL( का उपयोग करें और इसे तालिका में एक न्यूल कॉलम के रूप में बनाया जाएगा।

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