无法根据触发器中的INSERTED表设置值

时间:2013-06-19 07:49:25

标签: sql-server tsql variables triggers

目标:我在插入触发器之后创建,应该根据此表中与创建新版本的促销相关的规则将新记录插入OrderSuspendRule表。

问题 我无法为@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

1 个答案:

答案 0 :(得分:0)

for insert触发器中,您可以假设已插入inserted表中的所有行。无需使用scope_identity()仔细检查。

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

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