我在SQL Server 2005中有一个简单的表,包含3列:DateStart、DateEnd和Value。我试图设置一个"表检查约束"来避免插入重叠的记录。例如,如果在这样的表中有一条记录,其中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] 为空的情况下,当我插入第一条记录时 EXISTS 操作符仍然返回 true。我错了吗?是否可能设置这样的约束?
顺便说一下,我认为 DateStart 包括在范围内,而 DateEnd 则不包括在范围内。
Asset
节点始终位于诸如Clustered Index Insert
或Clustered Index Update
之类的节点上方,这意味着它是后执行的。 - Branko Dimitrijevic