SQL Server A disparador para trabajar en múltiples inserciones de fila

Mantengo un código que tiene un activador en una tabla para incrementar una columna. Esa columna es utilizada por una aplicación de tercerosA. Digamos que la tabla se llamaprueba con dos columnasnum1 ynum2. El disparador se ejecuta en cada inserción denum1 enprueba. El siguiente es el desencadenante:

USE [db1]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[TEST_MYTRIG] ON [dbo].[test]
FOR INSERT AS
begin
SET NOCOUNT ON
DECLARE @PROC_NEWNUM1 VARCHAR (10)
DECLARE @NEWNUM2 numeric(20)

SELECT @PROC_NEWNUM1 = num1 FROM INSERTED
select @NEWNUM2 = MAX(num2) from TEST
if @NEWNUM2 is null
Begin
set  @NEWNUM2  = 0
end
set @NEWNUM2 = @NEWNUM2 + 1
UPDATE TEST SET num2 = @NEWNUM2 WHERE num1 = @PROC_NEWNUM1
SET NOCOUNT OFF
End

Esto funciona bien en inserciones simples basadas en filas, pero hay otra aplicación de tercerosB (suspiro) que a veces hace múltiples inserciones en esta tabla, algo así, pero no exactamente:

INSERT INTO [db1].[dbo].[test]
           ([num1])

   Select db1.dbo.test.num1 from [db1].[dbo].[test]
GO

Esto hace que el disparador se comporte de forma errática ...

Ahora no tengo acceso a la fuente de la aplicaciónA oB y solo controla la base de datos y el disparador. ¿Hay algo que se pueda hacer con el disparador para que las actualizaciones realizadas anum2 son correctos en caso de múltiples inserciones?

Solución:

La siguiente es la solución basada en el código de affan:

 DECLARE @PROC_NEWNUM1 VARCHAR (10)
 DECLARE @NEWNUM2 numeric(20)
 DECLARE my_Cursor CURSOR FAST_FORWARD FOR SELECT num1 FROM INSERTED;

 OPEN my_Cursor 
 FETCH NEXT FROM my_Cursor into @PROC_NEWNUM1

 WHILE @@FETCH_STATUS = 0 
 BEGIN 

 select @NEWNUM2 = MAX(num2) from TEST
 if @NEWNUM2 is null
 Begin
    set  @NEWNUM2  = 0
 End
 set @NEWNUM2 = @NEWNUM2 + 1
 UPDATE TEST SET num2 = @NEWNUM2  WHERE num1 = @PROC_NEWNUM1
 FETCH NEXT FROM my_Cursor into @PROC_NEWNUM1  
 END

CLOSE my_Cursor
DEALLOCATE my_Cursor

Verifique aquí un enfoque basado en conjuntos:SQL Server - Reescribe el disparador para evitar el enfoque basado en el cursor

Respuestas a la pregunta(4)

Su respuesta a la pregunta