0

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

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

样本插入:

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
4

1 回答 1

0

for insert触发器内部,您可以假设inserted表中的所有行都已插入。没有必要用scope_identity().

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

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

于 2013-06-19T08:32:23.850 回答