CHECK को बाद निष्पादित किया जा रहा है पंक्ति सम्मिलित कर दी गई है, इसलिए सीमा स्वयं के साथ ओवरलैप हो जाती है।
आपको कुछ ऐसा शामिल करने के लिए अपने WHERE में संशोधन करना होगा:@MyTableId <> MyTableId
।
BTW, आपकी WHERE अभिव्यक्ति को सरल बनाया जा सकता है।
रेंज नहीं ओवरलैप करें अगर:
- एक श्रेणी का अंत दूसरे के शुरू होने से पहले होता है
- या एक श्रेणी की शुरुआत दूसरे के अंत के बाद होती है।
जिसे SQL में लिखा जा सकता है जैसे:
WHERE @DateEnd < DateStart OR DateEnd < @DateStart
करने वाली . की श्रेणी प्राप्त करने के लिए इसे अस्वीकार करें ओवरलैप...
WHERE NOT (@DateEnd < DateStart OR DateEnd < @DateStart)
...जो डी मॉर्गन के नियमों के अनुसार समान है...
WHERE NOT (@DateEnd < DateStart) AND NOT (DateEnd < @DateStart)
...जो समान है:
WHERE @DateEnd >= DateStart AND DateEnd >= @DateStart
तो आपका अंतिम WHERE होना चाहिए:
WHERE
@MyTableId <> MyTableId
AND @DateEnd >= DateStart
AND DateEnd >= @DateStart
[एसक्यूएल फिडल]
नोट:श्रेणियों को "स्पर्श" करने की अनुमति देने के लिए, <=
. का उपयोग करें प्रारंभिक अभिव्यक्ति में, जो >
. उत्पन्न करेगा अंतिम अभिव्यक्ति में।