Sql server 用于处理多行插入的触发器
我知道这可能是个重复的问题。参考,它使用触发器中的游标来处理多行插入,这可能会降低性能。文档中应该有解决方案,但我不知道如何让它发挥作用。插入多行后是否有其他方法触发触发器 以下是我的触发器示例:Sql server 用于处理多行插入的触发器,sql-server,Sql Server,我知道这可能是个重复的问题。参考,它使用触发器中的游标来处理多行插入,这可能会降低性能。文档中应该有解决方案,但我不知道如何让它发挥作用。插入多行后是否有其他方法触发触发器 以下是我的触发器示例: ALTER TRIGGER [dbo].[UpdateTaskStatus] ON [dbo].[STG_CANCEL_TASK] AFTER INSERT AS BEGIN DECLARE @NO_HC VARCHAR (20) = NULL; DECLARE @taskId VARCH
ALTER TRIGGER [dbo].[UpdateTaskStatus]
ON [dbo].[STG_CANCEL_TASK]
AFTER INSERT
AS
BEGIN
DECLARE @NO_HC VARCHAR (20) = NULL;
DECLARE @taskId VARCHAR (80) = NULL;
DECLARE @START_DATE DATETIME = NULL;
SELECT @NO_HC = RTRIM(LTRIM(INSERTED.NO_HC)) FROM INSERTED;
SELECT @START_DATE = START_DTM
FROM MSS.dbo.TR_TASK
WHERE NO_HC = @NO_HC
SET @taskId = (SELECT TASK_ID
FROM MSS.dbo.TR_TASK
WHERE NO_HC = @NO_HC)
IF (@START_DATE IS NOT NULL)
BEGIN
UPDATE MCS.dbo.STG_CANCEL_TASK
SET RESULT = 'Error',
TASK_ID = @taskId
WHERE NO_HC = @NO_HC
END
ELSE
BEGIN
UPDATE MCS.dbo.STG_CANCEL_TASK
SET RESULT = 'Success',
TASK_ID = @taskId
WHERE NO_HC = @NO_HC
END
END;
下面是insert语句的示例:
INSERT INTO STG_CANCEL_TASK (NO_HC)
VALUES ('2018032801'),
('2018032802'),
('2018032803'),
('2018032804'),
('2018032805')
更新:目前,我将触发器修改为类似于此的内容,并且它现在起作用了。我不确定这是不是正确的方法
下面的内容会有所帮助
UPDATE M
SET m.result = CASE
WHEN i.result IS NULL
THEN 'error'
ELSE 'success'
END
FROM inserted i
JOIN MCS.dbo.STG_CANCEL_TASK M ON m.task_id-i.task_id
AND m.NO_HC = RTRIM(LTRIM(i.NO_HC))
AND m.START_DTM = i.START_DTM
下面的内容会有所帮助
UPDATE M
SET m.result = CASE
WHEN i.result IS NULL
THEN 'error'
ELSE 'success'
END
FROM inserted i
JOIN MCS.dbo.STG_CANCEL_TASK M ON m.task_id-i.task_id
AND m.NO_HC = RTRIM(LTRIM(i.NO_HC))
AND m.START_DTM = i.START_DTM
谢谢你的回答,这对上面这样的简单触发器帮助很大。但实际上我创建的触发器并不是那么简单,所以我通过填充临时表来修改触发器。我试图修改您的代码,并在此基础上加入插入表,您可能需要根据您的需要进行修改。在您修改后的代码中仍有一些红色标志,如
从MSS.dbo.TR_任务中选择START_DTM,其中NO_HC=@NO_HC
。当有多行时,您可能会遇到数据不正确的问题。是的,您是对的。这就是为什么我现在说它有效的原因,因为tru TASK
中的NO_HC
是唯一的,它由Java代码处理。谢谢你的回答,它对上面这样的简单触发器帮助很大。但实际上我创建的触发器并不是那么简单,所以我通过填充临时表来修改触发器。我试图修改您的代码,并在此基础上加入插入表,您可能需要根据您的需要进行修改。在您修改后的代码中仍有一些红色标志,如从MSS.dbo.TR_任务中选择START_DTM,其中NO_HC=@NO_HC
。当有多行时,您可能会遇到数据不正确的问题。是的,您是对的。这就是为什么我说它现在起作用的原因,因为tru任务中的NO_-HC
是唯一的,由Java代码处理。