关于触发器的问题,高分求助!!!!
我想用触发器来按照不同的ClassID值来自动递增字段ID的值,我按照以下的方法在插入一条记录时正常,但如果进行多行同时插入时,就是用insert table select * from table2这样的形式插入时,新插入的ID字段值都相同,并未像我预想中的那样自动递增。
CREATE TRIGGER [MaintenanceID_Insert] ON [dbo].[OptionItem]
INSTEAD OF INSERT
AS
insert into OptionItem (ClassID, ID, RootID, PID, Layer, [Order], Child, Name, Comment)
select ClassID, ID = (select isnull(Max(ID), 0) + 1 from OptionItem where ClassID = inserted.ClassID), RootID, PID, Layer, [Order], Child, Name, Comment from inserted
后来我改成用游标的方式,逐条的进行插入,但后来才发现在inserted表中的记录其OptionID字段全部为0,因此我无法定位到inserted中的某条记录,因此假如同时插入25条记录,真实的就会出现25*25=625条记录。
Declare @OptionID int, @ClassID int
Declare InsertCollection cursor for select OptionID, ClassID from inserted
open InsertCollection
fetch next from InsertCollection into @OptionID, @ClassID
while @@FETCH_STATUS <> -1
begin
--update OptionItem set ID = (select isnull(Max(ID), 0) + 1 from OptionItem where ClassID = @ClassID) where OptionID = @OptionID
--insert into OptionItem (ClassID, ID, RootID, PID, Layer, [Order], Child, Name, Comment)
-- select ClassID, ID = (select isnull(Max(ID), 0) + 1 from OptionItem where ClassID = @ClassID), RootID, PID, Layer, [Order], Child, Name, Comment from inserted where OptionID = @OptionID
select * from inserted where OptionID = @OptionID
fetch next from InsertCollection into @OptionID, @ClassID
end
CLOSE InsertCollection
DEALLOCATE InsertCollection
请问这样的问题我应该如何解决呢??
CREATE TRIGGER [MaintenanceID_Insert] ON [dbo].[OptionItem]
INSTEAD OF INSERT
AS
insert into OptionItem (ClassID, ID, RootID, PID, Layer, [Order], Child, Name, Comment)
select ClassID, ID = (select isnull(Max(ID), 0) + 1 from OptionItem where ClassID = inserted.ClassID), RootID, PID, Layer, [Order], Child, Name, Comment from inserted
后来我改成用游标的方式,逐条的进行插入,但后来才发现在inserted表中的记录其OptionID字段全部为0,因此我无法定位到inserted中的某条记录,因此假如同时插入25条记录,真实的就会出现25*25=625条记录。
Declare @OptionID int, @ClassID int
Declare InsertCollection cursor for select OptionID, ClassID from inserted
open InsertCollection
fetch next from InsertCollection into @OptionID, @ClassID
while @@FETCH_STATUS <> -1
begin
--update OptionItem set ID = (select isnull(Max(ID), 0) + 1 from OptionItem where ClassID = @ClassID) where OptionID = @OptionID
--insert into OptionItem (ClassID, ID, RootID, PID, Layer, [Order], Child, Name, Comment)
-- select ClassID, ID = (select isnull(Max(ID), 0) + 1 from OptionItem where ClassID = @ClassID), RootID, PID, Layer, [Order], Child, Name, Comment from inserted where OptionID = @OptionID
select * from inserted where OptionID = @OptionID
fetch next from InsertCollection into @OptionID, @ClassID
end
CLOSE InsertCollection
DEALLOCATE InsertCollection
请问这样的问题我应该如何解决呢??
...全文
相关推荐
关于oracle触发器before和after的应用问题
#### DML触发器与替代触发器- **DML触发器**:这类触发器可在数据操纵语言(DML)操作前或后触发,适用于单个行或整个语句级别。
改进型TSPC D触发器设计
本文提出一种改进型真单相时钟(MTSPC)D触发器,有效抑制中间节点毛刺,降低功耗与延迟。基于UMC 180纳米CMOS工艺,该触发器在1.8V电源下实现1GHz工作频率,MSB延迟0.96ns,功耗244.2μW,PDP为0.23pJ,显著优于传统TSPC D触发器。
数据库原理实验五:存储过程与触发器
注意你的s、sc、c表中包含的数据是否正确哦,代码蓝多多一个一个调试的都是没问题的哦! –1、创建一个存储过程Pro_Com,该存储过程的作用是:当执行该存储过程时,返回"计算机"系学生的所有信息。 –2、执行Pro_Com存储过程,查看"计算机"系学生的情况 –3、删除Proc_Com存储过程 –4、创建一个存储过程Proc_grade_90,在sc表中查出成绩大于90分的学生在s表中的基本信息,并执行该存储过程 –5、创建带参数的存储过程Proc_Sname,该存储过程返回student数据库中某个姓名
jk触发器波形图怎么画?主从jk触发器波形图
在主从JK触发器中,信号的传递需要经过两个触发器,因此会在两个时钟周期之间产生一个延迟,这可以避免由于时钟信号的不确定状态带来的竞争-冒险问题。首先,了解JK触发器的基本概念和工作原理是必要的。
几种基本触发器之间的转换
反之,如果使用一个JK触发器并保持J=K,则可以通过适当的时钟控制来模拟D触发器的行为。触发器的分类有多种方式,按电路结构可分为基本RS触发器、同步触发器、主从触发器和边沿触发器等。


