Sql server 插入多个记录时触发器不工作

Sql server 插入多个记录时触发器不工作,sql-server,triggers,Sql Server,Triggers,当我在Pedidos表中插入一条记录时,以下触发器工作正常 但是,当我插入多条记录时,会收到一条512错误消息。我搜索了有关插入多个记录和触发器的详细信息,但没有找到问题的答案 触发器读取插入的记录并从其他表中查找值,以修改table Planifications中列situacion的值 我这样做是完全错误的吗?我的扳机有什么明显的问题吗 CREATE TRIGGER TRG_INS_PL_SYNC_STATUS_PLA ON dbo.pedidos after insert as begin

当我在Pedidos表中插入一条记录时,以下触发器工作正常

但是,当我插入多条记录时,会收到一条512错误消息。我搜索了有关插入多个记录和触发器的详细信息,但没有找到问题的答案

触发器读取插入的记录并从其他表中查找值,以修改table Planifications中列situacion的值

我这样做是完全错误的吗?我的扳机有什么明显的问题吗

CREATE TRIGGER TRG_INS_PL_SYNC_STATUS_PLA ON dbo.pedidos after insert as begin if @@ROWCOUNT = 0
    return
set nocount on
declare @v_idpla int,
        @v_situacion nvarchar(12),
        @v_nombre nvarchar(50),
        @v_almacen nvarchar(50), 
        @v_status_pedido nvarchar(4);   

set @v_almacen = (select  almacen_pedido from inserted);
set @v_nombre =(select cliente from inserted);
set @v_status_pedido = (select status_pedido from inserted); 
set @v_situacion = (select top 1 nombre from dbo.StatusPlanificacion 
                    where STATUS_PEDIDO = @v_status_pedido);
set @v_idpla = (select top 1 id from dbo.Planificaciones 
                where dia_entrega >= GETDATE() and situacion <> 'Departed'  
                      and nombre like '%'+@v_almacen +'%'+ @v_nombre);
if(@v_idpla is not null)
    begin
        --select Timespan=SYSDATETIME() from inserted;
        select @@rowcount; 
        UPDATE DBO.Planificaciones
        SET situacion = @v_situacion
        WHERE id = @v_idpla;
    end
end

更新和解决:根据tanner的建议,我将对代码和工作进行下一次更新,但我认为有些人会发现这一点更加清晰和有用。在tanner建议的例子中,cursor说这不是最好的方法,最好的选择是连接。在我的例子中,这个插入永远不会同时超过50个插入

    CREATE TRIGGER TRG_INS_PL_SYNC_STATUS_PLA
    ON dbo.pedidos
    after insert as
    begin

declare @v_idpla int,@v_situacion nvarchar(12),@v_nombre nvarchar(50),@v_almacen nvarchar(50), @v_status_pedido nvarchar(4) 
DECLARE c_cursor CURSOR FAST_FORWARD FOR SELECT ALMACEN_PEDIDO, CLIENTE, STATUS_PEDIDO FROM INSERTED;
OPEN c_cursor
fetch next from c_cursor into @v_almacen,@v_nombre,@v_status_pedido
--declared and open cursor chargin values to variables
while @@fetch_status = 0
begin
    -- set values to variables from anothers tables
    set @v_situacion = (select top 1 nombre from dbo.StatusPlanificacion where STATUS_PEDIDO = @v_status_pedido);
    set @v_idpla = (select top 1 id from dbo.Planificaciones where dia_entrega >= GETDATE() and
        situacion <> 'Departed' and nombre like '%'+@v_almacen +'%'+ @v_nombre);
    --check value not null for assigned variable and do update to the value
    if(@v_idpla is not null)
        begin
            UPDATE DBO.Planificaciones
            SET situacion = @v_situacion
            WHERE id = @v_idpla;
        end 
       --move to the next row of cursor
       fetch next from c_cursor into @v_almacen,@v_nombre,@v_status_pedido
end
CLOSE c_cursor
DEALLOCATE c_cursor
end

不确定代码是否100%正确,但应该给你一个想法

inserted是包含该批处理的所有行的数据集。您只需要将其视为基于集合的操作

CREATE TRIGGER TRG_INS_PL_SYNC_STATUS_PLA
ON dbo.pedidos
    AFTER INSERT
AS
BEGIN
    UPDATE p
        SET 
            situacion =  i.nombre
    FROM DBO.Planificaciones p
    INNER JOIN (
        SELECT
            v_idpla.id
            v_situacion.nombre
        FROM INSERTED I
        CROSS APPLY (
            select top 1 
                SP.nombre 
            from dbo.StatusPlanificacion SP
            where 
                SP.STATUS_PEDIDO = I.STATUS_PEDIDO
        ) v_situacion
        CROSS APPLY (
            select top 1 
                Pla.id 
            from dbo.Planificaciones Pla
            where 
                Pla.dia_entrega >= GETDATE() and
                Pla.situacion <> 'Departed' and 
                Pla.nombre like '%'+I.ALMACEN_PEDIDO +'%'+ I.CLIENTE
        ) v_idpla
    ) I ON
        P.id = I.id
END

您的代码需要重新分解,因为它错误地假设插入的代码只包含一条记录。如果在一个批次中插入多条记录,则不会出现这种情况。可能重复感谢回复Jaco,您能否建议我在一个批次中插入多条记录的示例,使用触发器参考另一个表来查找更新语句并将其应用于值?检查Tanner链接,谢谢。在我的例子中,这个插入永远不会同时超过50个插入-对,但是多久插入一次,同时插入多少用户?说真的,你应该真正尝试并学习如何以一种基于集合的方式而不是以一行一行的方式来解决这类问题。我不能保证@mxix建议的正确性,但这是一个触发器应该如何完成其工作的示例:在尽可能少的步骤中。mxix感谢您的时间,它工作得非常好。仅更改SET situacion=i.nombre的SET situacion=v_situacion.nombre。测试和工作!!!