2011-11-26 10 views
5

मेरे पास दो टेबल, Table_A और Table_B हैं। Table_A में Table_B के साथ एक से अधिक संबंध हैं।SQL सर्वर 2008 में किसी अन्य तालिका में किसी मान के आधार पर वर्तमान तालिका को अद्यतन करने के लिए मैं अद्यतन ट्रिगर कैसे लिख सकता हूं?

बच्चे तालिका (तालिका_B) में एक रिकॉर्ड डालने के बाद मैं मूल तालिका (तालिका_ए) में किसी फ़ील्ड से मूल्य प्राप्त करने के लिए एक ट्रिगर का उपयोग करना चाहता हूं और वर्तमान में तालिका_B में सम्मिलित रिकॉर्ड अपडेट करना चाहता हूं।

Table_A

PK|EmpID|MemID|Firstname|Lastname 
---------------------------------- 
1 |1234 |AB123|John  | Doe 
2 |5678 |CD456|Jane  | Smith 

Table_B

PK|EmpID|MemID|Description 
--------------------- 
1 |1234 |NULL |Finance 
2 |1234 |NULL |IT 
3 |5678 |NULL |Finance 
4 |5678 |NULL |Management 

ट्रिगर Table_A से MemID मूल्य पकड़ें और उसे Table_B जहां [Table_A]। [EmpID] = [में संबंधित मान है अद्यतन करना चाहिए Table_B]। [EmpID]।

PK|EmpID|MemID|Description 
--------------------- 
1 |1234 |AB123|Finance 
2 |1234 |AB123|IT 
3 |5678 |CD456|Finance 
4 |5678 |CD456|Management 

मैं बड़े पैमाने पर अन्य तकनीकी साइटों खोज की, लेकिन इस विशेष परिदृश्य के साथ एक को खोजने के लिए प्रतीत नहीं कर सकते हैं: इस प्रकार बेशक Table_B में 4 आवेषण के बाद परिणाम होना चाहिए। एक बेताब कदम के रूप में मैंने इस साइट में पंजीकरण किया है और यह मदद के लिए मेरी पहली पोस्ट होगी।

एमएस एसक्यूएल सर्वर 2008 आर 2 में अपना पहला ट्रिगर बनाने की कोशिश में मेरा व्यर्थ प्रयास निम्नलिखित है।

CREATE TRIGGER dbo.trgInsMemID 
ON dbo.Table_B 
AFTER INSERT 
AS 
    BEGIN 
     UPDATE dbo.Table_B 
      SET MemID = 
       (SELECT MemID 
       FROM inserted i 
       JOIN dbo.Table_A c ON c.EmpID = i.EmpID) 
      FROM dbo.Table_B b 
      JOIN inserted i ON i.MemID = b.MemID 
    END 
+2

स्टैक ओवरव्लो में आपका स्वागत है। तालिका संरचनाओं, डेटा, अपेक्षित परिणाम, और आपके प्रयास को अब तक पोस्ट करने के लिए धन्यवाद। यह प्रयास दिखाता है, और समुदाय के लिए आपकी सहायता करने के लिए यह बहुत आसान बनाता है। +1 –

उत्तर

3

मेरा मानना ​​है कि आप अपने अद्यतन बयान इस तरह देखने के लिए बदल चाहता हूँ:

UPDATE b 
SET b.MemId = a.MemId 
FROM dbo.Table_B AS b 
INNER JOIN Inserted AS i ON b.EmpId = i.EmpId 
INNER JOIN dbo.Table_A AS a ON b.EmpId = a.EmpId 

यह ख में ही रिकार्ड करता है कि insterted तालिका में भी थे अद्यतन करेगा। (पहली INNER JOIN)

यह तो Table_AEmpId पर में INNER JOIN के साथ अपने रिकॉर्ड को अपडेट करने के लिए उचित MemId खींचने के लिए होगा।

+0

मदद के लिए धन्यवाद और हाँ, मैंने 100 रिकॉर्ड डालने पर पूरी तरह से काम किया, और एक ट्रिगर की अपेक्षा के अनुसार इसमें कुछ सेकंड लग गए। मैं वास्तव में एक सी # प्रोग्राम (समांतरता को लागू करने) के माध्यम से एक टेक्स्ट फ़ाइल लोड कर रहा हूं जो डीबी को लिखने के लिए LINQ से SQL का उपयोग करता है और जब मैंने 2 फाइलों को लोड किया तो ट्रिगर सिंक से बाहर था। लेकिन कहने के लिए पर्याप्त है, आपने वास्तव में मेरे प्रश्न के आधार पर मेरे प्रश्न का उत्तर दिया है। मुझे ट्रिगर्स के साथ और अधिक खेलना होगा, अब आप मेरे वाक्यविन्यास को सही कर चुके हैं। धन्यवाद। – Django

+0

@Django एक और विकल्प, यदि MemId को तत्काल अपडेट नहीं किया जाना है, तो आपकी दोनों फाइलें डेटाबेस में लोड होने के बाद एक बार अद्यतन को चलाने के लिए है। यदि आप 'INNER JOIN डाले गए' लाइन को हटाते हैं तो आप Table_A से MemId के साथ EmpId पर Table_A से मेल खाने वाले सभी तालिका_B रिकॉर्ड अपडेट कर पाएंगे। आप सिंक्रनाइज़ेशन के साथ समस्याओं को दूर करने के लिए लेनदेन को भी देख सकते हैं, लेकिन यह लॉकिंग में वृद्धि करेगा। –

+0

देर से उत्तर के लिए खेद है। मैं एक और विकल्प प्रदान करने में आपकी मदद की सराहना करता हूं। दोनों का परीक्षण किया है और मैं पहली बार पसंद करता हूं। एक बार फिर आपका धन्यवाद। – Django

संबंधित मुद्दे

 संबंधित मुद्दे