Alsjeblieft, ik demonstreer dit met een voorbeeldschema, aangezien je je echte tabel-/kolomnamen niet hebt opgegeven.
Tabel:
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
)
Hier is de triggerdefinitie:
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
In principe vervangt het elke insert-instructie die op de tafel wordt gedaan door die in de trigger, dus ik controleer met behulp van de inserted
tijdelijke tabel om te zien of de waarde die probeert in te voegen in onze niet-nullable optionele kolom, col3
, is niets. Als dat zo is, vervang ik het door de toevoeging van col1
en col2
(Ik voeg nul samen omdat je niet vermeldde of de twee bronkolommen nullable zijn of niet).
U kunt dan insert-instructies uitvoeren die het al dan niet bevatten, ondanks het feit dat col3
is niet nullable:
INSERT INTO test(col1,col2)
SELECT 12, 31
GO
INSERT INTO test(col1, col2, col3)
SELECT 1, 2, 89
GO
Resultaten zijn:
ID COL1 COL2 COL3
------------------
1 12 31 43
2 1 2 89
Als de trigger er niet was, zou je een foutmelding kunnen krijgen bij het uitvoeren van die eerste insert-instructie, die je vertelt dat het geen NULL in col3
kon invoegen .
Merk ook op dat de tweede insert-instructie die een waarde specificeert niet is vervangen door de toevoeging, zoals gevraagd.
Hier is een werkende SQL Fiddle .