SQL Server触发器Trigger(4)

时间:2021-10-05 05:11:59

对于例子http://www.cnblogs.com/insus/articles/1921465.html写的触发器有bug,当使用http://www.cnblogs.com/insus/articles/1921618.html例子中的INSERT VALUES的语法头两种插入记录时,[Num]字段只做更第一笔,其他[Num]值均为NULL,

SQL Server触发器Trigger(4)


解决办法,只好修改触发器,代码如下,

SQL Server触发器Trigger(4)SQL Server触发器Trigger(4)代码
SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO

ALTER   TRIGGER   [ dbo ] . [ tri_OrderDemo_Insert ]   ON   [ dbo ] . [ OrderDemo ]
AFTER 
INSERT
AS
-- 创建一个临时表
IF   OBJECT_ID  ( ' tempdb.dbo.#T ' IS   NOT   NULL   DROP   TABLE  dbo.#T
-- 把所有添加记录都插入这个临时表中
SELECT   *   INTO  dbo.#T  FROM  inserted 

-- 宣告变量@MinKey为每次插入记录最初主键,@MaxKey为最后一个主键,@NumValue为[Num]字段值
DECLARE   @MinKey   INT , @MaxKey   INT , @NumValue   INT
-- 在临时表中找到最小主键和最大主键
SELECT   @MinKey   =   MIN ( [ OrderDemoId ] ),  @MaxKey   =   MAX ( [ OrderDemoId ] FROM  dbo.#T

-- 如果是第一次有记录插入表
IF  ( @MinKey   =   1 )
    
-- [Num]字段值等于主键值
     SET   @NumValue   =   @MinKey  
ELSE
    
BEGIN    
        
-- 如果表[OrderDemo]已经有记录存在,找到最大值的从字段[Num]
         SELECT   @NumValue   =    MAX ( [ Num ] )   FROM   [ dbo ] . [ OrderDemo ]
        
-- 并加上1
         SET   @NumValue   =   @NumValue   +   1         
    
END

-- 循环插入的记录
WHILE   @MinKey   <=   @MaxKey  
BEGIN
    
-- 更新新插入记录的[Num]字段值。
     UPDATE   [ dbo ] . [ OrderDemo ]   SET   [ Num ]   =   @NumValue   WHERE   [ OrderDemoId ]    =   @MinKey  
    
SET   @MinKey   =   @MinKey   +   1
    
SET   @NumValue   =   @NumValue   +   1
END