2012-03-15 12 views
5

मैं जोड़ने के लिए थक गया हूं जांचें और मैं अभी तक केवल असफल रहा हूं।जांच की जांच करें - इस संदर्भ में सबक्वायरीज़ की अनुमति नहीं है

संदेश 1046, स्तर 15, राज्य 1, पंक्ति 6 ​​

सबक्वेरी इस संदर्भ में अनुमति नहीं है: क्या तरीका यह चारों ओर पाने के लिए किया जाएगा। केवल स्केलर एक्सप्रेशन की अनुमति है।

इस कोड है:

ALTER TABLE dbo.PropertySeasonDiscount ADD CONSTRAINT 
[CC_PropertySeasonDiscount_MadeFrom_MadeTo] 
CHECK (
    (SELECT COUNT(PropertySeasonDiscountId) FROM dbo.PropertySeasonDiscounts apsdeb 
     WHERE 
      (apsdeb.PropertySeasonId = PropertySeasonId) AND 
      (
       (apsdeb.ValidForReservationsMadeTo >= ValidForReservationsMadeFrom AND ValidForReservationsMadeFrom >= apsdeb.ValidForReservationsMadeFrom) OR 
       (apsdeb.ValidForReservationsMadeFrom <= ValidForReservationsMadeTo AND ValidForReservationsMadeTo <= apsdeb.ValidForReservationsMadeTo) 
      ) 
    ) = 0 
); 
+0

एक ट्रिगर के बारे में कैसे? –

+0

@AaronBertrand मैंने तर्क को यूडीएफ के अंदर रखा और उस यूडीएफ के लिए मूल्य वापस कर दिया। तब मैंने इसके खिलाफ बाधा के अंदर तुलना की और शिकायत नहीं की। बेहतर ट्रिगर होगा? – tugberk

+0

@AaronBertrand जब मैंने बनाया था तब शिकायत नहीं हुई थी लेकिन जब मैं तालिका में मूल्य जोड़ने की कोशिश करता हूं तो यह अप्रत्याशित रूप से कार्य करता है। – tugberk

उत्तर

10

एसक्यूएल सर्वर वर्तमान में support subqueries for CHECK CONSTRAINTs नहीं करता है।

जैसा कि आपने पाया है, उपनगरीय सीमा को रोकने की कोशिश करते समय trouble with CHECK constraints यूडीएफ शामिल हो सकता है।

विकल्प बाधा कार्यान्वयन रणनीतियों शुरू हो रहा प्रक्रियात्मक और प्रक्रियात्मक एम्बेडेड रहे हैं। पूर्व को प्राथमिकता दी जाती है क्योंकि, घोषणात्मक बाधाओं के साथ आम तौर पर, उन्हें बाधित नहीं किया जा सकता है।

अच्छी तरह से अनुकूलित और समेकन मुद्दों को संभालने वाली एक ट्रिगर प्रक्रियात्मक रणनीति को कार्यान्वित करना गैर-तुच्छ है लेकिन अभी भी करने योग्य है। मैं अत्यधिक Applied Mathematics for Database Professionals By Lex de Haan, Toon Koppelaars, अध्याय 11 की सिफारिश करता हूं (कोड उदाहरण ओरेकल हैं लेकिन आसानी से SQL सर्वर पर पोर्ट किया जा सकता है)।

3

जैसा कि अन्य ने पहले ही उल्लेख किया है, इस प्रकार की जांच बाधाओं को अभी तक SQL-Server में लागू नहीं किया गया है। ट्रिगर्स के अलावा, आप टेबल के डिज़ाइन को बदलने की संभावना की भी जांच कर सकते हैं।

एक संभावित विकल्प में प्रत्येक पंक्ति में पिछले अंतराल समाप्ति तिथि को संग्रहीत करना शामिल है। विवरण के लिए Storing intervals of time with no overlaps देखें। लागू करने वाली बाधाएं सरल हैं लेकिन तालिका में सम्मिलन/हटाना/अपडेट से निपटने के तरीके पर जटिलताएं हैं।

एक और संभावना छूट के लिए एक पंक्ति (शुरुआत और समाप्ति तिथि के साथ) को स्टोर करने के लिए नहीं होगी, लेकिन पंक्तियों की एक पूरी श्रृंखला (छूट अंतराल की प्रत्येक तारीख के लिए)। लागू करने वाली बाधाएं भी सरल होंगी लेकिन आपके वर्तमान तालिका में से प्रत्येक की बजाय बहुत सारी पंक्तियां होंगी।

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