Il CHECK viene eseguito dopo la riga è stata inserita, quindi l'intervallo si sovrappone a se stesso.
Dovrai modificare il tuo WHERE per includere qualcosa come:@MyTableId <> MyTableId
.
A proposito, la tua espressione WHERE può essere semplificata.
Gli intervalli non sovrapponi se:
- la fine di un intervallo è prima dell'inizio dell'altro
- o l'inizio di un intervallo è dopo la fine dell'altro.
Che potrebbe essere scritto in SQL come:
WHERE @DateEnd < DateStart OR DateEnd < @DateStart
Annullalo per ottenere gli intervalli che fanno sovrapposizione...
WHERE NOT (@DateEnd < DateStart OR DateEnd < @DateStart)
...che secondo le leggi di De Morgan è uguale a...
WHERE NOT (@DateEnd < DateStart) AND NOT (DateEnd < @DateStart)
...che è lo stesso di:
WHERE @DateEnd >= DateStart AND DateEnd >= @DateStart
Quindi il tuo DOVE finale dovrebbe essere:
WHERE
@MyTableId <> MyTableId
AND @DateEnd >= DateStart
AND DateEnd >= @DateStart
[SQL Fiddle]
NOTA:per consentire agli intervalli di "toccarsi", utilizzare <=
nell'espressione iniziale, che produrrebbe >
nell'espressione finale.