我在SQL server2005中有一个简单的表,包含3列:DateStart、DateEnd和Value.我try 设置"表判断约束",以避免插入重叠记录.例如,如果在这样的表中存在DateStart=2012-01-01(1月1日)和DateEnd 2012-01-15(1月15日)的记录,则判断约束必须避免插入DateStart=2012-01-10(无用DateEnd)的记录、DateEnd=2012-01-10(无用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]empty EXISTS,当我插入第一条记录时,操作符也会返回true.我在哪里?可以这样设置约束吗?
顺便说一句,我认为DateStart包括在范围内,而DateEnd不包括在范围内.