如何在 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 将字段转换为行