当我在表Pedidos
上插入一条记录时,我有以下触发器正常工作。
但是,当我插入多个记录时,我收到一条512
错误消息。我一直在寻找有关插入多个记录和触发器的详细信息,但没有找到我的问题的答案。
触发器读取插入的记录并从其他表中查找值以修改表situacion
中列planificaciones
的值。
我尝试这样做的方式完全错了吗?我的触发器有任何明显的问题吗?
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
更新&amp;已解决:在tanner建议上,我会对代码进行下一次更新并运行,但我认为有些人可以发现这一点更加清晰和有用。在tanner的建议中,说光标不是最好的方法,最好的方法是加入。在我的情况下,这个插入件永远不会同时超过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
答案 0 :(得分:1)
不确定代码是否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