首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >插入后不起作用

问插入后不起作用
EN

Stack Overflow用户
提问于 2013-09-21 22:40:49
回答 1查看 113关注 0票数 0

所有id列都有auto_increment

在触发器中:

代码语言:javascript
复制
    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仅在update之后返回值,而不在insert之后返回值。我是不是一定要用scope_identity()之类的?

EN

回答 1

Stack Overflow用户

发布于 2013-09-21 22:55:13

您的主要问题是:假设触发器每行调用一次-这是而不是!

该触发器在每个语句中调用一次,如果您的语句影响多行,则Inserted伪表将包含多行-因此此处的语句

代码语言:javascript
复制
set @MyId1 = (select Id from inserted)

真的行不通--它会选择一个任意的行(不管有多少行)。

你需要重写你的触发器来考虑这个事实!假设Inserted包含100行--您希望如何处理它?你想要达到什么目的?触发器不返回值-它们将记录到一个审计表中,或者更新其他行,或者类似的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18933915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档