如何编写更新触发器以基于SQL Server 2008中另一个表中的值更新当前表?

问题描述:

我有两个表,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

欢迎来到*。感谢您发布表结构,数据,预期结果以及迄今的尝试。它显示了努力,并使社区更容易帮助你。 +1 –

我相信你会想改变这个样子你的更新语句:

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