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()触发器,即使只有一行,也无法工作。关于我触发的同一个表中的更新,我将更改它。你还有别的想法吗?如果你只需要做一次这个操作,那为什么还要麻烦用触发器呢?只需将行插入到一个表中,然后插入到另一个表中,就完成了。。。。。