Le CHECK est exécuté après la ligne a été insérée, de sorte que la plage se chevauche.
Vous devrez modifier votre WHERE pour inclure quelque chose comme :@MyTableId <> MyTableId
.
BTW, votre expression WHERE peut être simplifiée.
Plages pas se chevauchent si :
- la fin d'une plage est avant le début de l'autre
- ou le début d'une plage est après la fin de l'autre.
Qui pourrait être écrit en SQL comme :
WHERE @DateEnd < DateStart OR DateEnd < @DateStart
Infirmez cela pour obtenir les plages qui font superposition...
WHERE NOT (@DateEnd < DateStart OR DateEnd < @DateStart)
...qui, selon les lois de De Morgan, est identique à...
WHERE NOT (@DateEnd < DateStart) AND NOT (DateEnd < @DateStart)
...qui est identique à :
WHERE @DateEnd >= DateStart AND DateEnd >= @DateStart
Donc, votre OÙ final devrait être :
WHERE
@MyTableId <> MyTableId
AND @DateEnd >= DateStart
AND DateEnd >= @DateStart
[SQL Violon]
REMARQUE :pour permettre aux plages de "se toucher", utilisez <=
dans l'expression de départ, ce qui produirait >
dans l'expression finale.