यह लीजिए, मैं इसे एक उदाहरण स्कीमा के साथ प्रदर्शित कर रहा हूं क्योंकि आपने अपनी वास्तविक तालिका/स्तंभ नाम प्रदान नहीं किए हैं।
तालिका:
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
)
यहाँ ट्रिगर परिभाषा है:
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
मूल रूप से यह ट्रिगर में से एक के साथ तालिका पर किए गए किसी भी सम्मिलित विवरण को बदल देता है, इसलिए मैं inserted
का उपयोग करके जांचता हूं अस्थायी तालिका यह देखने के लिए कि क्या वह मान जो हमारे गैर-शून्य वैकल्पिक कॉलम में डालने का प्रयास कर रहा है, col3
, शून्य है। अगर ऐसा है, तो मैं इसे col1
. के जोड़ से बदल देता हूं और col2
(मैं शून्य के साथ जोड़ रहा हूं क्योंकि आपने उल्लेख नहीं किया है कि दो स्रोत कॉलम शून्य हैं या नहीं)।
इसके बाद col3
. के बावजूद आप इन्सर्ट स्टेटमेंट चला सकते हैं जिसमें या तो इसे शामिल किया गया है या नहीं अशक्त नहीं है:
INSERT INTO test(col1,col2)
SELECT 12, 31
GO
INSERT INTO test(col1, col2, col3)
SELECT 1, 2, 89
GO
परिणाम हैं:
ID COL1 COL2 COL3
------------------
1 12 31 43
2 1 2 89
यदि ट्रिगर वहां नहीं था, तो आपको उस पहले सम्मिलन कथन को चलाने का प्रयास करने में त्रुटि हो सकती थी, आपको बता रही थी कि यह col3
में NULL सम्मिलित नहीं कर सका ।
यह भी ध्यान दें कि दूसरा इंसर्ट स्टेटमेंट जो कि एक मान निर्दिष्ट करता है, अनुरोध के अनुसार जोड़ द्वारा प्रतिस्थापित नहीं किया गया है।
यहां एक कार्यशील SQL Fiddle है ।