我在表格上有一个触发器:
ALTER TRIGGER [shoot_sms]
ON [dbo].[MyTable]
AFTER INSERT
AS
begin
declare @number bigint
declare @body varchar(50)
declare @flag int
select @number=number,@body=body,@flag=flag from inserted
if(@flag=0)
begin
insert into temptable (number,body,status)
select @number,@body,'P'
end
end
现在我在mytable中输入两个条目如下:
insert into mytable(number, body, flag)
values(3018440225, 'This is test', 0)
insert into mytable(number, body, flag)
values(3018440225, 'This is test', 0)
我一次执行这些查询,但对于这两个查询,触发器只触发一次并仅执行第一个查询的任务。
如何使其适用于两个插入语句?
答案 0 :(得分:2)
只是一个想法,但在这两个插入语句之间放置一个GO语句,这可能会导致触发器触发两次。
你应该重写你的触发器来处理我认为的多行插入。
这是您转换的查询。你现在应该得到两行。
ALTER TRIGGER [shoot_sms]
ON [dbo].[MyTable]
AFTER INSERT
AS
begin
insert into temptable (number,body,status)
select number,body,'P'
from inserted
where flag = 0
end
另请注意,您的触发器现在要简单得多。
答案 1 :(得分:1)
由于这两个语句都在一个SQL批处理中,触发器 (按设计)只触发一次。
触发器每行不会触发一次 - 每次声明触发一次!因此,如果您有一个影响多行的INSERT
或UPDATE
语句,则您的触发器将在Inserted
(可能还有Deleted
)伪表中有多行
您编写此触发器的方式实际上是不,考虑到Inserted
可能包含多行 - 如果您是Inserted
表,请从哪个行中选择一次插入20行?
select @number = number, @body = body, @flag = flag from inserted
您需要更改触发器才能将其考虑在内!