2013-06-19 19 views
0

目标:在创建插入触发器后,应根据此表中与创建新版本的升级相关的规则向OrderSuspendRule表插入新记录。无法基于触发器中的INSERTED表设置值

问题 我无法将值设置为@SUS_ID。选择返回值,但未设置为变量。

样品插入:

INSERT INTO PromotionHeader (Guid,CreatedAt,UpdatedAt,IsActive,CompanyId,UpdatedById,CreatedById,Name,[Description],ValidFrom,ValidTo,BusinessUnitId,OfferId,[Version],StatusId,PreviousId) 
select newid(),CreatedAt,UpdatedAt,1,CompanyId,UpdatedById,CreatedById,Name,[Description],ValidFrom,ValidTo,BusinessUnitId,OfferId,[Version]+1,StatusId,916 FROM PromotionHeader WHERE Id=916 

凡PreviousId点,旧版本的推广。

CREATE TRIGGER TRIG1 ON DBO.PromotionHeader 
AFTER INSERT 
AS 
DECLARE @SUS_ID INT 

SET @SUS_ID = (
     SELECT Max(id) 
     FROM OrderSuspendRule 
     WHERE PromotionHeaderId = (
     SELECT PreviousId 
     FROM inserted 
       WHERE ID = SCOPE_IDENTITY() 
       ) 
       AND ISACTIVE=1 
     ) 

IF (@SUS_ID IS NOT NULL) --**VARIABLE IS ALWAYS NULL NO MATTER WHAT** 
BEGIN 
    INSERT INTO OrderSuspendRule (
     Guid 
     ,CreatedAt 
     ,UpdatedAt 
     ,IsActive 
     ,CompanyId 
     ,UpdatedById 
     ,CreatedById 
     ,SuspendFrom 
     ,SuspendTo 
     ,PromotionHeaderId 
     ,SuspendTypeId 
     ,OfferItemId 
     ) 
    SELECT NEWID() 
     ,GETDATE() 
     ,GETDATE() 
     ,1 
     ,CompanyId 
     ,UpdatedById 
     ,CreatedById 
     ,SuspendFrom 
     ,SuspendTo 
     ,SCOPE_IDENTITY() 
     ,SuspendTypeId 
     ,OfferItemId 
    FROM OrderSuspendRule 
    WHERE id = @SUS_ID 
END 

回答

0

里面一个for insert触发,你可以假设的是,在inserted表中的所有行插入。没有必要再次检查这与scope_identity()

要解释为什么scope_identity()null,请记住scope_identity()返回当前作用域中最后插入的标识。由于您的触发器在自己的范围内运行,因此除非触发器本身执行插入操作,否则将始终为null

另外,请注意您的触发器可以运行插入多行。这意味着你不能期望只有一个@sus_id,可能会有很多。

+0

谢谢,我正在检查scope_identity(),它正在返回值,但我没有想到该触发器运行在不同的范围。另外我考虑到了使用游标进行多行插入的事实。再次感谢! –

相关问题