Værsgo, jeg demonstrerer dette med et eksempelskema, da du ikke har angivet dine rigtige tabel-/kolonnenavne.
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
)
Her er triggerdefinitionen:
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
Grundlæggende erstatter den enhver insert-sætning lavet på bordet med den i triggeren, så jeg tjekker ved at bruge inserted
midlertidig tabel for at se, om værdien, der forsøger at blive indsat i vores valgfrie kolonne, der ikke kan nulstilles, col3
, er NULL. Hvis det er, erstatter jeg det med tilføjelsen af col1
og col2
(Jeg smelter sammen med nul, da du ikke nævnte, om de to kildekolonner er nullbare eller ej).
Du kan derefter køre insert-sætninger, som enten inkluderer det eller ej, på trods af col3
er ikke nullbar:
INSERT INTO test(col1,col2)
SELECT 12, 31
GO
INSERT INTO test(col1, col2, col3)
SELECT 1, 2, 89
GO
Resultaterne er:
ID COL1 COL2 COL3
------------------
1 12 31 43
2 1 2 89
Hvis triggeren ikke var der, kunne du have fået en fejl ved at prøve at køre den første insert-sætning, der fortæller dig, at den ikke kunne indsætte NULL i col3
.
Bemærk også, at den anden insert-sætning, der angiver en værdi, ikke er blevet erstattet af tilføjelsen som anmodet.
Her er en fungerende SQL Fiddle .