Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 用于处理多行插入的触发器_Sql Server - Fatal编程技术网

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代码处理。