在触发器中使用 while exists 在无限循环中发送查询
Using while exists in triggers sends the query in infinite loop
我为插入创建了一个触发器,它工作正常。这会很好地创建触发器:
While (exists(Select Id from #temp))
但是插入查询进入了无限循环。我正在使用 while exists 一次容纳多个插入。谁能告诉我是什么导致了无限循环?
Create Table sqltutorial.Employee
(
Id int,
Name nvarchar(50),
Salary int,
Gender nvarchar(50),
DepartmentId int
)
Alter Trigger sqltutorial.trg_forinsert_Employee
on sqltutorial.Employee
For Insert
As
Begin
print 'Audit Begins'
Declare @Id int, @Name nvarchar(50), @Salary int,
@Gender nvarchar(50), @DepartmentId nvarchar(50)
Declare @AuditText nvarchar(500)
Select *
into #temp
from inserted
While (exists(Select Id from #temp))
Select @Id = Id from #temp
Select
@Id = Id, @Name = Name, @Salary = Salary,
@Gender = Gender, @DepartmentId = DepartmentID
from
#temp
Set @AuditText = 'New Record Inserted With Id='+Cast(@Id As nvarchar(50))+',Name='+@Name+' ,Salary='+CAST(@Salary as nvarchar(50))+' Gender'+@Gender
+' ,Department Id='+@DepartmentId+' on '+CAST((Select GETDATE()) AS nvarchar(50))+' by '+(Select system_user)
Insert into sqltutorial.AuditTrial
values (@AuditText)
Delete from #temp
where Id = @Id
print 'Audit Ends'
End
您不需要使用触发器中的所有变量和临时表,只需执行以下操作:
ALTER TRIGGER sqltutorial.trg_forinsert_Employee
ON sqltutorial.Employee
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO sqltutorial.AuditTrial
SELECT
' New Record Inserted With Id=' + CAST([Id] AS NVARCHAR(50)) +
',Name=' + [Name] +
',Salary=' + CAST(Salary AS NVARCHAR(50)) +
',Gender' + Gender +
',Department Id=' + DepartmentId +
' on ' + CAST((SELECT GETDATE()) AS NVARCHAR(50)) +
' by ' + CAST(system_user AS NVARCHAR(256))
FROM
inserted
END
无限循环的原因是您没有像这样在 WHILE
循环代码块中指定 BEGIN
和 END
:
WHILE SomeCondition = true
BEGIN
Do stuff
END
当您使用 WHILE
且未指定 BEGIN..END
时,WHILE
循环会一遍又一遍地重复 下一条语句 直到不再满足 WHILE 条件。在您的代码中,这永远不会发生,因为下一条语句不会从#temp 中删除任何内容。
换句话说,在您的代码中,这就是您要循环的内容:
While (exists(Select Id from #temp))
Select @Id = Id from #temp
此后的其余代码甚至都不会执行,因为 WHILE
循环永远不会退出。
我为插入创建了一个触发器,它工作正常。这会很好地创建触发器:
While (exists(Select Id from #temp))
但是插入查询进入了无限循环。我正在使用 while exists 一次容纳多个插入。谁能告诉我是什么导致了无限循环?
Create Table sqltutorial.Employee
(
Id int,
Name nvarchar(50),
Salary int,
Gender nvarchar(50),
DepartmentId int
)
Alter Trigger sqltutorial.trg_forinsert_Employee
on sqltutorial.Employee
For Insert
As
Begin
print 'Audit Begins'
Declare @Id int, @Name nvarchar(50), @Salary int,
@Gender nvarchar(50), @DepartmentId nvarchar(50)
Declare @AuditText nvarchar(500)
Select *
into #temp
from inserted
While (exists(Select Id from #temp))
Select @Id = Id from #temp
Select
@Id = Id, @Name = Name, @Salary = Salary,
@Gender = Gender, @DepartmentId = DepartmentID
from
#temp
Set @AuditText = 'New Record Inserted With Id='+Cast(@Id As nvarchar(50))+',Name='+@Name+' ,Salary='+CAST(@Salary as nvarchar(50))+' Gender'+@Gender
+' ,Department Id='+@DepartmentId+' on '+CAST((Select GETDATE()) AS nvarchar(50))+' by '+(Select system_user)
Insert into sqltutorial.AuditTrial
values (@AuditText)
Delete from #temp
where Id = @Id
print 'Audit Ends'
End
您不需要使用触发器中的所有变量和临时表,只需执行以下操作:
ALTER TRIGGER sqltutorial.trg_forinsert_Employee
ON sqltutorial.Employee
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO sqltutorial.AuditTrial
SELECT
' New Record Inserted With Id=' + CAST([Id] AS NVARCHAR(50)) +
',Name=' + [Name] +
',Salary=' + CAST(Salary AS NVARCHAR(50)) +
',Gender' + Gender +
',Department Id=' + DepartmentId +
' on ' + CAST((SELECT GETDATE()) AS NVARCHAR(50)) +
' by ' + CAST(system_user AS NVARCHAR(256))
FROM
inserted
END
无限循环的原因是您没有像这样在 WHILE
循环代码块中指定 BEGIN
和 END
:
WHILE SomeCondition = true
BEGIN
Do stuff
END
当您使用 WHILE
且未指定 BEGIN..END
时,WHILE
循环会一遍又一遍地重复 下一条语句 直到不再满足 WHILE 条件。在您的代码中,这永远不会发生,因为下一条语句不会从#temp 中删除任何内容。
换句话说,在您的代码中,这就是您要循环的内容:
While (exists(Select Id from #temp))
Select @Id = Id from #temp
此后的其余代码甚至都不会执行,因为 WHILE
循环永远不会退出。