所有id
列都有auto_increment
在我的触发器中:
ALTER trigger [dbo].[mytrig]
on [dbo].[requests]
after INSERT, UPDATE
as
begin
declare @MyId1 int
set @MyId1 = (select Id from inserted)
declare @MyId2 int
declare @MyId3 int
if (select column1 from inserted) = 1
begin
insert into [dbo].[contracts] select column1,column2,column3 .... from inserted
set @MyId2 = SCOPE_IDENTITY()
insert into [dbo].[History] select column1,column2,column3 .... from inserted
set @MyId3 = SCOPE_IDENTITY()
insert into [dbo].[contracts_depts](Id_Contract ,column5) select @MyId2,column6 from request_depts where Id_request=@MyId1
insert into [dbo].[History_depts] (Id_InHistory,column5) select @MyId3,column6 from request_depts where Id_request=@MyId1
end
end
@MyId1
仅在更新后返回值,但在插入后不返回值。我必须使用scope_identity()
或其他什么吗?
答案 0 :(得分:0)
你的主要问题是:你假设每行调用一次触发器 - 这是 NOT 的情况!
触发器每个语句称为一次,如果您的语句影响多行,Inserted
伪表将包含多行 - 所以您的声明在这里
set @MyId1 = (select Id from inserted)
实际上不会起作用 - 它将选择一个任意行(无论有多少行)。
您需要重写触发器才能将此事实考虑在内!假设Inserted
包含100行 - 您想如何处理?你想要实现什么目标?触发器不返回值 - 它们将记录到审计表中,或更新其他行,或类似的东西....