我在 sql server 2005 中有一个包含 3 列的简单表:DateStart、DateEnd 和 Value。我尝试设置“表检查约束”以避免插入重叠记录。例如,如果在此类表中存在 DateStart = 2012-01-01(1 月 1 日)和 DateEnd 2012-01-15(1 月 15 日)的记录,则 Check 约束必须避免插入 DateStart=2012-01-10 的记录( no care DateEnd)、DateEnd=2012-01-10 (no care DateStart) 的记录或 DateStart 2011-12-10 和 DateEnd 2012-02-01 的记录。
我以这种方式定义了一个UDF:
CREATE FUNCTION [dbo].[ufn_checkOverlappingDateRange]
(
@DateStart AS DATETIME
,@DateEnd AS DATETIME
)
RETURNS BIT
AS
BEGIN
DECLARE @retval BIT
/* date range at least one day */
IF (DATEDIFF(day,@DateStart,@DateEnd) < 1)
BEGIN
SET @retval=0
END
ELSE
BEGIN
IF EXISTS
(
SELECT
*
FROM [dbo].[myTable]
WHERE
((DateStart <= @DateStart) AND (DateEnd > @DateStart))
OR
((@DateStart <= DateStart) AND (@DateEnd > DateStart))
)
BEGIN
SET @retval=0
END
ELSE
BEGIN
SET @retval=1
END
END
RETURN @retval
END
然后认为检查可能是这样的:
ALTER TABLE [dbo].[myTable] WITH CHECK ADD CONSTRAINT [CK_OverlappingDateRange] CHECK ([dbo].[ufn_checkOverlappingDateRange]([DateStart],[DateEnd])<>(0))
但即使 [myTable] 为空 EXISTS 运算符在我插入第一条记录时也会返回 true。我在哪里?是否可以设置这样的约束?
顺便说一句,我认为 DateStart 包括在范围内,而 DateEnd 不包括在范围内。