मान लें कि आपके पास n_id, field
. पर एक अद्वितीय बाधा है जिसका अर्थ है कि आप अधिक से अधिक एक पंक्ति से मेल खा सकते हैं (सिद्धांत रूप में कम से कम) एक INSTEAD OF
का उपयोग कर सकते हैं चालू कर देना।
MERGE
. के साथ यह आसान होगा (लेकिन यह SQL Server 2008 तक उपलब्ध नहीं है) क्योंकि आपको UPDATES
. को कवर करने की आवश्यकता है मौजूदा डेटा का, INSERTS
(जहां एक NULL
मान NON NULL
पर सेट है one) और DELETES
जहां एक NON NULL
मान NULL
. पर सेट है ।
यहां आपको एक बात पर विचार करना होगा कि UPDATES
. से कैसे निपटा जाए जो सभी स्तंभों को एक पंक्ति में NULL
. पर सेट करता है मैंने नीचे दिए गए कोड के परीक्षण के दौरान ऐसा किया और एक या दो मिनट के लिए काफी उलझन में था जब तक मुझे एहसास नहीं हुआ कि इसने n_id
के लिए आधार तालिका में सभी पंक्तियों को हटा दिया था (जिसका अर्थ है कि ऑपरेशन किसी अन्य UPDATE
. के माध्यम से प्रतिवर्ती नहीं था बयान)। व्यू डेफिनिशन OUTER JOIN
. होने से इस समस्या से बचा जा सकता है किसी भी टेबल पर n_id
का पीके है।
चीज़ के प्रकार का एक उदाहरण नीचे है। आपको INSERT
. में संभावित दौड़ स्थितियों पर भी विचार करना होगा /DELETE
कोड इंगित किया गया है और क्या आपको वहां कुछ अतिरिक्त लॉकिंग संकेतों की आवश्यकता है।
CREATE TRIGGER trig
ON pivoted
INSTEAD OF UPDATE
AS
BEGIN
SET nocount ON;
DECLARE @unpivoted TABLE (
n_id INT,
field VARCHAR(10),
c_metadata_value VARCHAR(10))
INSERT INTO @unpivoted
SELECT *
FROM inserted UNPIVOT (data FOR col IN (fid, sid, NUMBER) ) AS unpvt
WHERE data IS NOT NULL
UPDATE m
SET m.c_metadata_value = u.c_metadata_value
FROM metadata m
JOIN @unpivoted u
ON u.n_id = m.n_id
AND u.c_metadata_value = m.field;
/*You need to consider race conditions below*/
DELETE FROM metadata
WHERE NOT EXISTS(SELECT *
FROM @unpivoted u
WHERE metadata.n_id = u.n_id
AND u.field = metadata.field)
INSERT INTO metadata
SELECT u.n_id,
u.field,
u.c_metadata_value
FROM @unpivoted u
WHERE NOT EXISTS (SELECT *
FROM metadata m
WHERE m.n_id = u.n_id
AND u.field = m.field)
END