如何编写更新触发器以基于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
我相信你会想改变这个样子你的更新语句:
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 JOIN
到Table_A
上EmpId
拉适当MemId
与更新您的记录。
谢谢你的帮助,是的,当我插入100条记录时它确实工作正常,并且如预期的触发器那样需要几秒钟。我实际上是通过一个C#程序(实现并行性)来加载一个文本文件,该文件使用LINQ to SQL写入数据库,当我加载2个文件时触发器不同步。但足以说,你的确根据我的帖子完全回答了我的问题。现在你已经纠正了我的语法,我只需要更多地使用触发器。谢谢。 – Django
@Django如果MemId不需要立即更新,另一种选择是在两个文件都加载到数据库后运行一次更新。如果删除INNER JOIN插入行,您将能够使用Table_A中的MemId更新所有与EmpId上的Table_A匹配的Table_B记录。您还可以查看事务以消除同步问题,但会增加锁定。 –
对不起,延迟回复。感谢您提供其他选择的帮助。已经测试过,我更喜欢第一个。再一次感谢你。 – Django
欢迎来到*。感谢您发布表结构,数据,预期结果以及迄今的尝试。它显示了努力,并使社区更容易帮助你。 +1 –