如何防止sql server 2012中的单个日期重叠

时间:2016-01-20 04:56:52

标签: sql-server

我有一个表EmployeeLeaves有列:

EmployeeID int,
LeaveTypeID int,
LeaveDate datetime2,
IsHalfDay bit,
DateCreated datetime2,
Createdby varchar

我请求您帮助我使用触发器阻止列的相同日期" LeaveDate"。没有日期范围,例如" Todate"和#34; FromDate"在表中。

提前致谢。

2 个答案:

答案 0 :(得分:3)

请参阅示例演示

CREATE TABLE EmployeeLeaves
  (
     EmployeeID  INT,
     LeaveTypeID INT,
     LeaveDate   DATETIME2,
     IsHalfDay   BIT,
     DateCreated DATETIME2,
     Createdby   VARCHAR(50)
  ) 

insert into EmployeeLeaves
values (1,1,'2016-01-01',0,getdate(),'Admin'),
(2,1,'2016-01-01',0,getdate(),'Admin'),
(3,1,'2016-01-01',0,getdate(),'Admin'),
(4,1,'2016-01-01',0,getdate(),'Admin'),
(5,1,'2016-01-01',0,getdate(),'Admin')

SELECT *
FROM   EmployeeLeaves

METHOD-1使用唯一约束

--Introduce the unique constraint
    ALTER TABLE EmployeeLeaves
      ADD CONSTRAINT uq_employeeid_leavedate UNIQUE (EmployeeId, LeaveDate) 
    --Try to create overlap
    insert into EmployeeLeaves
    values (1,1,'2016-01-01',0,getdate(),'Admin')
    --You will get the following error
    --Msg 2627, Level 14, State 1, Line 1
    --Violation of UNIQUE KEY constraint 'uq_employeeid_leavedate'. Cannot insert duplicate key in object 'dbo.EmployeeLeaves'. The duplicate key value is (1, 2016-01-01 00:00:00.0000000).
    --The statement has been terminated.
    --Insert proper date
    insert into EmployeeLeaves
    values (1,1,'2016-01-02',0,getdate(),'Admin')
    --Check the result
    SELECT *
    FROM   EmployeeLeaves

METHOD-2使用而不是触发器

ALTER TRIGGER Trigger_Test
ON EmployeeLeaves
INSTEAD OF INSERT
AS
  BEGIN
      IF EXISTS(SELECT TOP 1 1
                FROM   inserted I
                       INNER JOIN EmployeeLeaves e
                               ON i.EmployeeID = e.EmployeeID
                                  AND i.LeaveDate = e.LeaveDate)
        BEGIN
            RAISERROR (N'Overlapping range.',16,1);

            ROLLBACK TRANSACTION;
        END
      ELSE
        BEGIN
            INSERT INTO EmployeeLeaves
            SELECT *
            FROM   inserted
        END;
  END 

答案 1 :(得分:0)

您可以在休假日期字段中添加唯一约束,也可以使用

检查并引发异常
  

if exist( select top 1 EmployeeID from table where EmployeeID = @emploeeid and datediff(day,leavedate,@applydate)=0 and leavetypeid= @leavetypeid) begin raise_error('leave already exist',1,1) end