Aquí tienes, estoy demostrando esto con un esquema de ejemplo ya que no has proporcionado los nombres reales de la tabla/columna.
Mesa:
CREATE TABLE test
(
id INT NOT NULL PRIMARY KEY IDENTITY, --made up key
col1 INT, --first column to add, wasn't sure if this was nullable or not
col2 INT, --second column to add, wasn't sure if this was nullable or not
col3 INT NOT NULL --this is the column to optionally insert into
)
Aquí está la definición del disparador:
CREATE TRIGGER demo
ON test
INSTEAD OF INSERT
AS
INSERT INTO test (col1,col2,col3)
SELECT inserted.col1,
inserted.col2,
CASE
WHEN inserted.col3 IS NULL THEN COALESCE(inserted.col1, 0) + COALESCE(inserted.col2, 0)
ELSE inserted.col3
END
FROM inserted
Básicamente, reemplaza cualquier declaración de inserción realizada en la tabla con la del disparador, así que verifico usando inserted
tabla temporal para ver si el valor que se intenta insertar en nuestra columna opcional no anulable, col3
, es nulo. Si es así, lo reemplazo con la adición de col1
y col2
(Estoy fusionando con cero porque no mencionaste si las dos columnas de origen son anulables o no).
Luego puede ejecutar declaraciones de inserción que lo incluyen o no, a pesar del hecho de que col3
no es anulable:
INSERT INTO test(col1,col2)
SELECT 12, 31
GO
INSERT INTO test(col1, col2, col3)
SELECT 1, 2, 89
GO
Los resultados son:
ID COL1 COL2 COL3
------------------
1 12 31 43
2 1 2 89
Si el activador no estuviera allí, podría haber recibido un error al intentar ejecutar esa primera declaración de inserción, diciéndole que no podía insertar NULL en col3
.
Observe también que la segunda declaración de inserción que especifica un valor no ha sido reemplazada por la adición, como se solicitó.
Aquí hay un SQL Fiddle en funcionamiento .