Sql 在插入触发器和多行之后

Sql 在插入触发器和多行之后,sql,sql-server,triggers,multiple-records,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) REF

这些是我的桌子

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 ,
)
现在我要做的是将数据插入
课程
表中,
课程管理
将举行课程中发生或将发生的所有会议

  • 时间表\u ID
    -课程在哪几天举行会议,以及需要多少小时
  • Catalog\u Course\u ID
    可以找到课程的总学时
因此,如果我插入一个带有
课程编号\u ID
(来自目录课程表)、
时间表\u ID
S.Date
(strat 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
表是保留所有日期和假日的表,因此如果会议日期是某个假日,触发器现在将插入该日期并继续到下一次会议

现在,如果我插入一个带有
课程编号\u ID
(来自目录课程表)和
时间表\u ID
S.Date
的课程,一切都会正常进行

当我尝试为课程表插入多行时,它可以工作,但对于
课程管理
仅插入最后一行

我得到了5K行的表格,上面有课程号、日程号、美国日期,我想插入它

我还尝试使用where子句逐行输入,它正在工作

因此,唯一的问题是它有多行


有人知道问题出在哪里吗

首先,依我看,你扣扳机太多了。触发器应该非常小和精简-不要在触发器中进行大量计算!另外:您永远不会引用触发器中存在的
Inserted
伪表来保存要插入(或更新)的行-因此基本上您是在整个表上操作-这将再次成为一个主要的性能杀手!我还建议使用
SCOPE\u IDENTITY()
而不是其他任何东西(如
@@IDENTITY
)来获取新插入的标识值。首先,关于性能,我不太在乎,因为这只是一次,我的意思是以后我会插入5公里或更少的行,我不再需要触发器了。我尝试使用SCOPE_IDENTITY()触发器,即使只有一行,也无法工作。关于我触发的同一个表中的更新,我将更改它。你还有别的想法吗?如果你只需要做一次这个操作,那为什么还要麻烦用触发器呢?只需将行插入到一个表中,然后插入到另一个表中,就完成了。。。。。