目标:我在插入触发器之后创建,应该根据此表中与创建新版本的促销相关的规则将新记录插入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
答案 0 :(得分:0)
在for insert
触发器中,您可以假设已插入inserted
表中的所有行。无需使用scope_identity()
仔细检查。
要解释scope_identity()
为null
的原因,请记住scope_identity()
返回当前范围中最后插入的标识。由于您的触发器在其自己的范围内运行,因此除非触发器本身执行插入,否则它始终为null
。
另外,请注意,可以为多行插入运行触发器。这意味着您不能指望只有一个@sus_id
,可能会有很多。