如何在 SQL Server 2008 中通过单个查询更新两个表 [重复]

Posted

技术标签:

【中文标题】如何在 SQL Server 2008 中通过单个查询更新两个表 [重复]【英文标题】:How can I update two tables by single query in SQL Server 2008 [duplicate] 【发布时间】:2012-06-04 08:14:20 【问题描述】:

可能重复:How to update two tables in one statement in SQL Server 2005?

我有两张表,需要更新一张表,对另一张表生效。

这两个表是通过关系链接起来的

t1.col1 PK , t2.col1 FK   

t1                t2
_____________  _____________
|col1|  col2|  |col1 |col2 |            
|----|------|  |-----|-----|                             
|1   |  a   |  | 1   | d   |            
|2   |  b   |  | 2   | e   |            
|3   |  c   |  | 3   | f   |            
|____|______|  |_____|_____|

如何在 SQL Server 2008 的一个查询中更新这两个表?

我想做这样的事情

 Update College 
 Inner Join Class ON College.CollegeId = Class.CollegeId 
 set College.CollegeId = '33333333-3333-3333-3333-333333333333',
     Class.CollegeId = '33333333-3333-3333-3333-333333333333' 
 where 
     College.CollegeId = '071887ea-3c93-40ce-a112-3b849d352064' 

但我得到一个错误:

关键字“Inner”附近的语法不正确

【问题讨论】:

为什么不在一个事务中创建两个更新语句? 同意@AlanKuras。 SQL 2008 和 2005 在这件事上没有区别 开始事务,更新表 1,更新表 2,提交。更容易、更可维护、更不容易出错 哇,您可以确保您的错误消息至少与您提供的代码有关。投票结束 - 请注意提问的方式。 Romay_0987: CHK NOW I HAVE EDIT 根据 Sql server 2008 语法 【参考方案1】:

无论是在一个连接上的一个查询中使用一条语句更新 2 个表,还是在一个连接上的一个查询中使用两条语句更新 2 个表,实际上都是一回事。

您可以设置要传递给脚本的参数,然后您只需发送一次值并运行一次脚本,这将只使用一个连接。

declare @OldCollegeID
declare @NewCollegeID

Update Class set CollegeID = @NewCollegeID
where CollegeID = @OldCollegeID

Update College set CollegeID = @NewCollegeID
where CollegeID = @OldCollegeID

但是,我猜你想同时这样做的原因是因为你不能先更新大学而不更新班级,因为关系?由于外键 Class.CollegeID,尝试更新 College.CollegeID 将导致错误。反之亦然。除非您要更新到的 Class.CollegeID 存在于 College.CollegeID 中,否则 Class.CollegeID 将不可更新。在这种情况下,我会提出以下建议:

Create Procedure UpdateCollegeID
(
   declare @OldCollegeID varchar(100),
   declare @NewCollegeID varchar(100)
)

as

declare @CollegeName varchar(100)
declare @ClassName varchar(100)

set @CollegeName = (select CollegeName from College where CollegeID = @OldCollegeID)
set @ClassName = (select ClassName from Class where CollegeID = @OldCollegeID)

Insert into College (CollegeID, CollegeName)
Values(@NewCollegeID, @NewCollegeName)

Insert into Class (ClassID, CollegeID)
Values(@ClassID, @NewCollegeID, @ClassName)

Delete from Class where CollegeID = @OldCollegeID
Delete from College where CollegeID = @OldCollegeID

这将使用新 ID 更新您所有的旧大学记录,您不必担心。您可能必须在前端应用程序中做一些不同的事情来满足这一点,具体取决于它是什么。将其保留为存储过程将允许您执行它,并且所有内容都将更新为传递的参数。

【讨论】:

Thaaxn alot Mr.Joachim , 快乐伙伴,如果有帮助,请评价答案或将其标记为已接受的答案。谢谢J【参考方案2】:

你可以这样实现: 您可以使用事务二确保两个 UPDATE 语句被正确处理。

BEGIN TRANSACTION

UPDATE Table1
  SET Table1.col1= 'XXXX' 
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '010008'

UPDATE Table2
SET Table2.col1 = 'XXXX'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '010008'

提交

【讨论】:

我猜应该有人读过 UPDATE 命令的 Transact-SQL 语法! 不要更新主键。如果您有任何其他表引用它,它可能会导致您保持数据完整的许多问题。理想情况下,如果您想要一个可更新的唯一字段,请创建一个新字段。【参考方案3】:

您可以执行以下操作

 UPDATE T1 INNER JOIN T2 ON T1.COL1 = T2.COL1 SET T1.COL2 = 'X', T2.COL2= 'Y'
 WHERE T1.COL1 = 2

编码愉快!!!

【讨论】:

是的,这很有效,我在以前的项目中的很多地方都使用过它 它不起作用,关键字“Inner”附近的语法不正确我想做这样的事情 Update College Inner Join Class ON College.CollegeId = Class.CollegeId set College.CollegeId='33333333-3333- 3333-3333-333333333333',Class.CollegeId='33333333-3333-3333-3333-333333333333' 其中College.CollegeId='071887ea-3c93-40ce-a112-3b849d352064' 这将始终失败,因为您正在更新用于更新表的关系的主键/外键。 我猜应该有人读过 UPDATE 命令的 Transact-SQL 语法!

以上是关于如何在 SQL Server 2008 中通过单个查询更新两个表 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 中通过联接在更新表中长时间执行

在IIS7中通过PHP连接到SQL SERVER 2008(使用Windows身份验证)?

如何在 MS Access 2007 或 MS SQL Server 2005 中通过 SQL 将字段转换为行

在 Server 2008 R2 中通过 j-interop 访问 DCOM

请教SQL server 2008 R2 日志过大问题

如何在sql server中通过给定的邮政编码和以英里为单位的半径从附近的表中获取所有其他邮政编码或(纬度和经度)?