6

मैं मामला एक्सप्रेशन का उपयोग करके मौजूदा गणना स्तंभ बनाने के लिए कोशिश कर रहा हूँ:मेरा केस अभिव्यक्ति गैर-निर्धारक क्यों है?

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date]>'20100101' THEN [Date] 
    ELSE NULL 
    END PERSISTED 

MSDN स्पष्ट रूप से कहना है कि मामला नियतात्मक है here

हालांकि, मैं एक त्रुटि हो रही है:

Msg 4936, Level 16, State 1, Line 1 Computed column 'PreviousDate' in table 'Calendar' cannot be persisted because the column is non-deterministic.

बेशक, मैं एक स्केलर यूडीएफ बना सकता हूं और स्पष्ट रूप से इसे निर्धारिती के रूप में घोषित कर सकता हूं, लेकिन क्या इसके आसपास एक आसान तरीका है? मैं पहले से ही नवीनतम सर्विस पैक प्राप्त करने के बीच में हूं। धन्यवाद।

+0

पुराना सवाल है, मुझे पता है, लेकिन तुम कैसे * "एक अदिश यूडीएफ बना सकते हैं और स्पष्ट रूप से इसे के रूप में नियतात्मक की घोषणा करने के लिए" * एसक्यूएल सर्वर में प्रस्ताव है। मुझे बताया गया है कि आप ओरेकल में ऐसा कर सकते हैं, लेकिन मैंने कभी भी SQL सर्वर में कोई रास्ता नहीं देखा है ... – jimbobmcgee

उत्तर

17

आप CONVERT '20100101' with a style.

Source or target type is datetime or smalldatetime, the other source or target type is a character string, and a nondeterministic style is specified.

तो करने की जरूरत है, इस प्रयास करें:

स्ट्रिंग से
...WHEN [Date] > CONVERT(datetime, '20100101', 112).... 

दिनांक पार्स किया जा सकता है अविश्वसनीय I've answered before (mostly in comments) रूप

संपादित करें:

मैं नहीं होगा कहें कि यह एक बग है, लेकिन एसक्यूएल सर्वर 100% स्पष्टीकरण मांग रहा है। yyyymmdd आईएसओ नहीं है और SQL सर्वर को पार्स yyyy-mm-dd अविश्वसनीय है (मेरा उत्तर लिंक देखें)

+0

+1 - मुझे इसे हराया, आह! –

5

जाहिर है यह डेटा प्रकारों के बारे में बहुत picky है। ऐसा करने का प्रयास करें:

ALTER TABLE dbo.Calendar ADD PreviousDate AS 
case WHEN [Date ]> Convert(DateTime, '20100101', 101) THEN [Date] 
    ELSE Convert(DateTime, NULL, 101) 
    END PERSISTED 
+0

दुर्भाग्य से मैं दोनों उत्तरों को उत्तर के रूप में चिह्नित नहीं कर सकता, इसलिए मैंने केवल पहले को चिह्नित किया, और आपका ऊपर उठाया। धन्यवाद! –

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