【发布时间】:2017-11-11 10:39:13
【问题描述】:
我有一个UPDATE 触发器,它在将记录插入表中时发生,但我想在触发触发器的同时创建一个INSERT。
原始 INSERT 将一条记录放入 BatchQueue 表中,当这种情况发生时,触发器被触发以更新第二个表 [Call]。
我希望能够在 BatchQueue 表中添加一条记录,该记录与插入的初始记录基本相似,但在时间列和另一列上有所不同。从技术上讲,我可以在原始插入上执行此操作,但仅当 SFlags = 11 时才需要执行 WHEN 或 IF
原来的INSERT语句:
BEGIN
INSERT INTO BatchQueue (TimeToExecute, Operation,
Parameter,RuleID, FilterID, SFlags)
SELECT @TimeToExecute, @Operation, @Parameter, @RuleID, @FilterID,
@SFlags FROM Call WHERE [ID]=@Parameter AND Active=0
AND (OnlineCount>0 OR OnlineScreenCount>0
OR (Flags&POWER(2,26)=POWER(2,26)))
END
这是我想做的插入:
BEGIN
INSERT INTO [dbo].[BatchQueue]
VALUES(DateAdd(mi,2,getutcdate()),1,Call.ID,2,null,9,0,0,0)
WHEN Call.SFlags = 11
END
触发语句:
BEGIN
IF @@ROWCOUNT > 0
BEGIN
SET NOCOUNT ON
UPDATE Call SET StoreReqCount = StoreReqCount + CallCount.actionCount
FROM Call, (SELECT Parameter, [actionCount] = COUNT(*) FROM inserted
GROUP BY Parameter ) AS CallCount
WHERE Call.ID = CallCount.Parameter
END
有人可以建议如何最好地做到这一点吗?我希望我已经澄清了。重申一下,要么使用 SFlags=11 的条件将第二个 INSERT 添加到第一个,要么使用触发器进行插入。哪个更好?
编辑:
尝试了以下方法:
SELECT @StoreActionID = [ID] FROM BatchQueue
WHERE Parameter=@Parameter AND RuleID=@RuleID AND
SFlags=@SFlags
IF @StoreActionID IS NOT NULL
BEGIN
UPDATE BatchQueue SET FilterID = @FilterID WHERE [ID] =
@StoreActionID
END
ELSE
BEGIN
INSERT INTO BatchQueue (TimeToExecute, Operation, Parameter,
RuleID, FilterID, SFlags)
SELECT @TimeToExecute, @Operation, @Parameter, @RuleID,
@FilterID, @SFlags FROM Call WHERE [ID]=@Parameter AND Active=0
AND (OnlineCount>0 OR OnlineScreenCount>0 OR
(Flags&POWER(2,26)=POWER(2,26))) --bit26 indicates META-DATA-ONLY
END
-- ADDED ADDITIONAL INSERT TO INSERT ACTION BASED ON STOREFLAGS
BEGIN
IF @SFlags = 11
BEGIN
INSERT INTO BatchQueue (TimeToExecute, Operation, Parameter,
RuleID, FilterID, SFlags)
SELECT @TimeToExecute, @Operation, @Parameter, @RuleID,
@FilterID, 9 FROM Call WHERE [ID]=@Parameter AND Active=0
AND (OnlineCount>0 OR OnlineScreenCount>0 OR
(Flags&POWER(2,26)=POWER(2,26))) --bit26 indicates META-DATA-ONLY
END
END
【问题讨论】:
-
请澄清您的问题。您是否希望修改您的
INSERT INTO [dbo].[BatchQueue]语句以使某些值来自Call表?如果有,请说明逻辑。 -
谢谢。我试图更清楚地重申这个问题
-
您是否希望在
Call.SFlags = 11时向 BatchQueue 插入第二条记录(行)?或修改现有记录? -
根据该条件在行中添加第二个。我尝试了一些东西,但没有奏效。现在将添加编辑。
-
您有两个选择:在触发器中执行此操作,但您需要确保禁用直接触发器递归 (stackoverflow.com/a/1529516/6305294) - 如果其他代码依赖于它,可能会出现问题。
标签: sql sql-server