插入触发器和多行后

时间:2014-08-01 12:05:54

标签: sql sql-server triggers multiple-records

这些是我的表

CREATE TABLE Courses
(
   Course_ID INT IDENTITY  (100 , 10) NOT NULL , 
      CONSTRAINT PK_Courses PRIMARY KEY (Course_ID) 
   Catalog_Course_ID NVARCHAR(10) NOT NULL,
      CONSTRAINT FK_Catalog_Course_ID FOREIGN KEY (Course_Number_ID) REFERENCES Course_Catalog (Course_Number_ID) 
   Schedule_ID INT NOT NULL , 
      CONSTRAINT FK_Schedule_ID  FOREIGN KEY (Schedule_ID) REFERENCES Classs_Schedule(Schedule_ID)
   S_Date DATE NOT NULL , 
   E_Date DATE NOT NULL , 
)

CREATE TABLE Course_Management
(
   Number INT IDENTITNY (1,1) PRIMARY KEY '
   Course_ID INT NOT NULL ,
      CONSTRAINT FK_Course_ID FOREIGN KEY (Course_ID) REFERENCES  Courses (Course_ID)
   Course_Date_Meeting DATE NOT NULL,
   Duration INT NOT NULL ,
)

现在我要做的是将数据插入Courses表格,Course_Management将保留在课程中发生或将要发生的所有会议。

  • Schedule_ID - 这几天课程开会,还有几个小时的时间。
  • Catalog_Course_ID可以找到课程的总小时数

因此,如果我使用Course_Number_ID(来自目录课程表),Schedule_IDS.Date(strat date)插入一个课程,触发器将找到我们应该做多少次会议(通过查找在找到所有会议后,课程持续时间除以会议持续时间,E.Date(结束日期)将作为最后插入的会议更新。

我写了这个触发器

CREATE TRIGGER CouseMetting
ON [dbo].[Courses] AFTER INSERT
AS 
BEGIN
  DECLARE @Course_ID INT --Last Course ID insert
  SET @Course_ID = (Select @@IDENTITY)

  DECLARE @CCID INT -- Course Catlog ID reference to CourseID last insert
  SET @CCID = (SELECT [Course_Number_ID] 
               FROM [dbo].[Courses] 
               WHERE [Course_ID] = @Course_ID)

  DECLARE @NUM INT -- Duration of the course in hours reference Course Catlog ID 
  SET @NUM = (select [Duration] 
              from [dbo].[Course_Catalog] where [Number_ID] = @CCID)

  DECLARE @MET INT -- Numbers of meeting 
  DECLARE @DUR INT -- Duration of 1 meeting 
  DECLARE @DATE DATE -- Start date of the CourseID

  SET @DATE = (SELECT [S_Date] 
               FROM [dbo].[Courses] 
               WHERE [Course_ID] = @Course_ID)

  DECLARE @Holiday varchar (24) -- Holiday in Israel
  DECLARE @DAY_NAME NVARCHAR(10) -- English day name
  DECLARE @Schedule_ID INT

  SET @Schedule_ID = (SELECT [Schedule_ID] 
                      FROM [dbo].[Courses] 
                      WHERE [Course_ID] = @Course_ID)
  SET @DUR = (SELECT [Meeting_Dur] 
              FROM [dbo].[Classs_Schedule] WHERE [Schedule_ID] = @Schedule_ID)
  SET @MET = @NUM/@dur

  While @MET > 0 
  Begin
     SET @Holiday = (SELECT  [HolidayISR] FROM [dbo].[FullDates] WHERE [Date] = @DATE)

     IF @Holiday IS NULL
     BEGIN
            INSERT INTO [dbo].[Course_Management] ([Course_ID] , [Course_Date_Meeting] ,[Duration] )
            VALUES (@Course_ID ,  @DATE , @DUR )

            SET @met = @met - 1
     END

     SET @DAY_NAME = (SELECT [DayName] FROM [dbo].[FullDates]  WHERE  [Date] = @DATE)

     IF @Schedule_ID = 1
     BEGIN
            IF @DAY_NAME LIKE 'Sunday' 
            BEGIN 
                SET @DATE= DATEADD(DD , 2 , @DATE) 
            END
            ELSE SET @DATE= DATEADD(DD , 5 , @DATE)
            END

            IF @Schedule_ID = 2
            BEGIN
                IF @DAY_NAME LIKE 'Sunday'  
                BEGIN
                     SET @DATE= DATEADD(DD , 3 , @DATE)
                END
            ELSE SET @DATE = DATEADD(DD , 4 , @DATE)
            END

            IF @Schedule_ID = 3 
            BEGIN 
                IF @DAY_NAME LIKE 'Sunday' 
                BEGIN
                     SET @DATE= DATEADD(DD , 4 , @DATE)
                END
                ELSE SET @DATE = DATEADD(DD , 3 , @DATE)
            END

            IF @Schedule_ID = 4
            BEGIN 
               IF @DAY_NAME LIKE 'Sunday' 
               BEGIN
                   SET @DATE= DATEADD(DD , 2 , @DATE)
               END
               ELSE SET @DATE = DATEADD(DD , 5 , @DATE)
            END

            IF @Schedule_ID = 5
            BEGIN 
               IF @DAY_NAME LIKE 'Sunday'  
               BEGIN
                   SET @DATE= DATEADD(DD , 3 , @DATE)
               END
               ELSE SET @DATE = DATEADD(DD , 4 , @DATE)
            END

            IF @Schedule_ID = 6
            BEGIN 
            IF @DAY_NAME LIKE 'Sunday' 
            BEGIN 
            SET @DATE= DATEADD(DD , 4 , @DATE)
            END
            ELSE SET @DATE = DATEADD(DD , 3 , @DATE)
            END
            IF @Schedule_ID = 7 
            BEGIN 
            IF @DAY_NAME LIKE 'Monday' 
            BEGIN
            SET @DATE= DATEADD(DD , 2 , @DATE)
            END
            ELSE SET @DATE = DATEADD(DD , 5 , @DATE)
            END
            IF @Schedule_ID = 8 
            BEGIN 
            IF @DAY_NAME LIKE 'Monday' 
            BEGIN
            SET @DATE= DATEADD(DD , 3 , @DATE)
            END
            ELSE SET @DATE = DATEADD(DD , 4 , @DATE)
            END
            IF @Schedule_ID = 9 
            BEGIN 
            IF @DAY_NAME LIKE 'Monday' 
            BEGIN
            SET @DATE= DATEADD(DD , 2 , @DATE)
            END
            ELSE SET @DATE = DATEADD(DD , 5 , @DATE)
            END
            IF @Schedule_ID = 10
            BEGIN 
            IF @DAY_NAME LIKE 'Monday'
            BEGIN
            SET @DATE= DATEADD(DD , 3 , @DATE)
            END
            ELSE SET @DATE = DATEADD(DD , 4 , @DATE)
            END
            IF @Schedule_ID = 11
            BEGIN 
            IF @DAY_NAME LIKE 'Tuesday'  
            BEGIN
            SET @DATE= DATEADD(DD , 2 , @DATE)
            END
            ELSE SET @DATE = DATEADD(DD , 5 , @DATE)
            END
            IF @Schedule_ID = 12 
            BEGIN 
            IF @DAY_NAME LIKE 'Tuesday' 
            BEGIN
            SET @DATE= DATEADD(DD , 2 , @DATE)
            END
            ELSE SET @DATE = DATEADD(DD , 5 , @DATE)
            END


            END
            UPDATE [dbo].[Courses] 
            SET [E_Date] = (SELECT TOP 1 [Course_Date_Meeting] 
            FROM [dbo].[Course_Management]
            WHERE Course_ID = @Course_ID
            ORDER BY [Course_Date_Meeting] DESC )
            END

Fulldates表是保存所有日期和假日的表格,因此如果会议日期是某个假日,那么触发器现在将插入它并将继续下一次会议

现在,如果我使用Course_Number_ID(来自目录课程表)和Schedule_ID以及S.Date插入一个课程,那么每件事都可以。

当我尝试为课程表插入多行时,它只适用于Course_Management已插入的最后一行。

我有5K行表,包含Course_Number_ID,Schedule_ID,S.Date,我想插入它。

我还尝试逐行输入where子句并且它正在工作。

所以多行的唯一问题就在于它。

任何人都知道问题出在哪里?

0 个答案:

没有答案