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

时间:2012-06-04 08:14:21

标签: c# asp.net sql-server-2008

  

可能重复:
  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' 

但是我收到了错误:

  

关键字“内部”

附近的语法不正确

3 个答案:

答案 0 :(得分: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'

COMMIT

答案 1 :(得分:2)

无论是在一个连接上的一个查询中更新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更新您所有旧的大学记录,您不必担心。您可能必须在前端应用程序中执行不同的操作,以满足此需求,具体取决于它是什么。将它保存为存储过程将允许您执行它,并且所有内容都将更新为传递的参数。

希望这有帮助。

由于 Ĵ

答案 2 :(得分:-2)

您可以执行以下操作

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

快乐的编码!!!