Sql I';我们在Employee_表上创建了一个触发器,它根据插入行的Dept_ID更新Department_表列

Sql I';我们在Employee_表上创建了一个触发器,它根据插入行的Dept_ID更新Department_表列,sql,sql-server,tsql,triggers,Sql,Sql Server,Tsql,Triggers,我在Employee_表上创建了一个触发器,它根据插入行的Dept_ID更新Department_表列。现在我只想在触发器的“插入”表中有多个部门ID的行时输入光标&我在互联网上找不到任何答案。任何线索都将不胜感激 USE [Test_DB] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER TRIGGER [dbo].[tr_Employee_Table_ForInsert] ON [dbo].[Employee_Table]

我在Employee_表上创建了一个触发器,它根据插入行的Dept_ID更新Department_表列。现在我只想在触发器的“插入”表中有多个部门ID的行时输入光标&我在互联网上找不到任何答案。任何线索都将不胜感激

USE [Test_DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tr_Employee_Table_ForInsert]
ON [dbo].[Employee_Table]
FOR INSERT
AS 
BEGIN

INSERT INTO Employee_Backup (Emp_ID, Emp_Name, Emp_Address, Comp_ID, Dept_ID)
SELECT Emp_ID, Emp_Name, Emp_Address, Comp_ID, Dept_ID
FROM inserted

DECLARE Cursor_Inserted CURSOR FOR
SELECT * FROM inserted
OPEN Cursor_Inserted
DECLARE @ID INT
DECLARE @EmpName NVARCHAR(50)
DECLARE @EmpAdd NVARCHAR(100)
DECLARE @CompID INT
DECLARE @DeptID INT

FETCH NEXT FROM Cursor_Inserted INTO @ID,@EmpName,@EmpAdd,@CompID,@DeptID
WHILE(@@Fetch_Status=0)
BEGIN

    DECLARE @Old_ID INT
    SELECT @Old_ID = (SELECT COUNT(Emp_ID) FROM Employee_Table 
    WHERE Dept_ID = @DeptID)

    UPDATE Department_Table SET Emp_Count =
    (@Old_ID) WHERE Dept_ID = @DeptID

    FETCH NEXT FROM Cursor_Inserted INTO @ID,@EmpName,@EmpAdd,@CompID,@DeptID

END
CLOSE Cursor_Inserted
DEALLOCATE Cursor_Inserted

END

在Sql中,游标只能作为最后手段使用,因为它们效率很低。
我真的不明白为什么您希望在
Employee_Backup
中复制所有插入的数据,也不明白为什么您希望在department表中保留特定部门的员工人数,您可以在需要时简单地选择计数,但我可以提供比您当前拥有的更好的触发器:

USE [Test_DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tr_Employee_Table_ForInsert]
ON [dbo].[Employee_Table]
FOR INSERT
AS 
BEGIN

INSERT INTO Employee_Backup (Emp_ID, Emp_Name, Emp_Address, Comp_ID, Dept_ID)
SELECT Emp_ID, Emp_Name, Emp_Address, Comp_ID, Dept_ID
FROM inserted

UPDATE D
SET Emp_Count = E.Emp_Count
FROM Department_Table D
INNER JOIN
(
    SELECT Dept_ID, COUNT(Emp_ID) Emp_Count
    FROM Employee_Table
    GROUP BY Dept_ID
) E ON(D.Dept_ID = E.Dept_ID)


END

如果您必须存储员工计数(通常最好不要存储,除非您在检索过程中仅计算它会出现性能问题),您是否考虑过使用索引视图来代替它,它将自动执行维护?(因此不会为存储的计算值提供任何不同步的机会)如何编写
if
语句来实现“具有多个部门ID&我在internet上找不到任何答案”?你真的想在阻止其他表格更新的同时触发上网吗?@peter其实没有这个必要,我只是在学习如何使用游标。这种内部连接也很好&我认为对于大数据集,这种内部连接将更快地给出结果。