SQL从表双主键,Item_No自加

主要思路:找出当前的Item_No,加一 —>将插入的数据保存入临时表,更新Item_No—>Select式插入
ALTER TRIGGER [dbo].[addItemList]
ON [dbo].[Te_Lista]
instead of INSERT
AS
 DECLARE @NEW_INDEX int
 set @NEW_INDEX = 1
 SELECT TOP 1 @NEW_INDEX=Item_No + 1 FROM Te_Lista
         WHERE  List_No = (select top 1 List_No from inserted) ORDER BY Item_No DESC
 SELECT * INTO #tmp FROM inserted
 UPDATE  #tmp
 SET Item_No = Item_No

 INSERT dbo.Te_Lista
 SELECT *
 FROM #tmp

 DROP TABLE #tmp

go

本来也想用函数,做成一个通用的,但是 --存储过程可以(函数不可以)

我觉得这种通用的触发还是写存储过程吧,就不要像我一样,一个个愚蠢的加到每张表,存储过程以后更新

把字段名一个个写出来查询这个方法太蠢了,所以我觉得使用exec执行动态sql语句,但还是悲剧了.

实际上,在INSTEAD OF INSERT触发器只接insert 原表,sql不认定为递归,而通过exec调用插入源表,被认定为递归,递归在INSTEAD OF触发器不允许

所以我想到使用临时表的方法,inserted表是不允许update的


下面这个程序有个很不好的地方,字段名是写死的,如果以后更新很不方便(不适用)

Create TRIGGER addItemPur
ON dbo.Te_Purchasea
instead of INSERT
AS
 DECLARE @NEW_INDEX int
 set @NEW_INDEX = 1
 SELECT TOP 1 @NEW_INDEX=Item_No + 1 FROM Te_Purchasea
         WHERE  Pur_No = (select top 1 Pur_No from inserted) ORDER BY Item_No DESC
insert dbo.Te_Purchasea
select Pur_No,Item_No=@NEW_INDEX, 
Conn_No, Mat_No, Vendor, Vnd_Sim, Price, Pur_Qty, Req_Pur_Qty, In_Qty, Vnd_Qty, Sto_Qty, Give_Date, 
Remark, Create_Name, Create_Date, Upd_Name, Upd_Date, Mat_Desc, Mat_Name from inserted
go

有不对或者更好的方法望指正!!!



你可能感兴趣的:(SQL)