2011-11-26 47 views
5

我有兩個表,Table_A和Table_B。 Table_A與Table_B具有一對多的關係。如何編寫更新觸發器以基於SQL Server 2008中另一個表中的值更新當前表?

在子表(Table_B)中插入一條記錄後,我希望使用觸發器從父表(Table_A)的字段中獲取值並更新Table_B中當前插入的記錄。

表-A

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

表-B

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

觸發應該抓住從表-A的MemID值,並更新它在表-B,其中[表-A]。[的EmpID] = [對應的值表-B] [的EmpID]。當然,後表-B 4個插件的結果應該是如下:

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

我廣泛搜索等技術的網站,但似乎無法找到一個與此特定情形。作爲一個絕望的舉動,我已經註冊到這個網站,這將是我的第一個求助。

以下是我嘗試在MS SQL Server 2008 R2中創建第一個觸發器的嘗試。

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

歡迎來到StackOverflow。感謝您發佈表結構,數據,預期結果以及迄今的嘗試。它顯示了努力,並使社區更容易幫助你。 +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 

這將更新僅在B中也分別在insterted表中的記錄。 (第一INNER JOIN

然後它會INNER JOINTable_AEmpId拉適當MemId與更新您的記錄。

+0

謝謝你的幫助,是的,當我插入100條記錄時它確實工作正常,並且如預期的觸發器那樣需要幾秒鐘。我實際上是通過一個C#程序(實現並行性)來加載一個文本文件,該文件使用LINQ to SQL寫入數據庫,當我加載2個文件時觸發器不同步。但足以說,你的確根據我的帖子完全回答了我的問題。現在你已經糾正了我的語法,我只需要更多地使用觸發器。謝謝。 – Django

+0

@Django如果MemId不需要立即更新,另一種選擇是在兩個文件都加載到數據庫後運行一次更新。如果刪除INNER JOIN插入行,您將能夠使用Table_A中的MemId更新所有與EmpId上的Table_A匹配的Table_B記錄。您還可以查看事務以消除同步問題,但會增加鎖定。 –

+0

對不起,延遲迴復。感謝您提供其他選擇的幫助。已經測試過,我更喜歡第一個。再一次感謝你。 – Django

相關問題