Sql 如何使用单个查询更新多个表
我有两个表需要更新: 表A包括:ID、人名、日期、状态 表B包括:人名、日期、状态 对于A中的每一行,B中可以有多行具有相同的personID 我需要对状态为2的所有结果进行“循环”,并将日期和状态更新为1 此外,对于状态为2的A中的每一行,我需要更新B中具有相同personID(即A.ID==B.personID)的所有行–我还需要将日期和状态更新为1 因此,基本上,如果我要以编程(或算法)的方式来做这件事,它是这样的:Sql 如何使用单个查询更新多个表,sql,sql-server,Sql,Sql Server,我有两个表需要更新: 表A包括:ID、人名、日期、状态 表B包括:人名、日期、状态 对于A中的每一行,B中可以有多行具有相同的personID 我需要对状态为2的所有结果进行“循环”,并将日期和状态更新为1 此外,对于状态为2的A中的每一行,我需要更新B中具有相同personID(即A.ID==B.personID)的所有行–我还需要将日期和状态更新为1 因此,基本上,如果我要以编程(或算法)的方式来做这件事,它是这样的: Foreach(var itemA in A) If (item
Foreach(var itemA in A)
If (itemA.status = 2)
itemA.status to 1
itemA.date = GetDate()
foreach(var itemB in B)
if(itemB.PersonID == itemA.ID && itemB.status != 2 )
Change itemB.status to 1
Change itemB.date = GetDate()
我知道如何使用以下sql语句更新B中的所有行:
UPDATE
B
SET
status = 1,
date = GETDATE()
FROM
B
INNER JOIN
A
ON
B.PersonID = A.ID
问题是我不知道如何同时更新表A,因为update语句中不能有多个表
感谢您的帮助以前有人问过以下问题: 不可能一次更新多个表 该问题的简要答复: 您不能在一条语句中更新多个表,但是,您可以使用一个事务来确保原子地处理两条update语句。您还可以对它们进行批处理,以避免往返
BEGIN TRANSACTION;
UPDATE Table1
SET Table1.LastName = 'DR. XXXXXX'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';
UPDATE Table2
SET Table2.WAprrs = 'start,stop'
FROM Table1 T1, Table2 T2
WHERE T1.id = T2.id
and T1.id = '011008';
COMMIT;
对于你的问题,类似这样的方法会奏效:
BEGIN TRANSACTION;
UPDATE B
SET status = 1
, date = GETDATE()
WHERE B.PersonId IN ( SELECT ID
FROM A
WHERE A.status = 2
);
UPDATE A
SET status = 1
, date = GETDATE()
WHERE A.status = 2;
COMMIT;
将所有内容放入事务中,并在成功时提交
DECLARE @err int
BEGIN TRANSACTION
UPDATE B
SET status = 1, date = GETDATE()
FROM B INNER JOIN A ON B.PersonID = A.ID
WHERE A.status = 2
SET @err = @@ERROR
IF @err = 0
BEGIN
UPDATE A
SET status = 1,
date = GETDATE()
WHERE status = 2
SET @err = @@ERROR
END
IF @err = 0
COMMIT
ELSE ROLLBACK
下面是使用
输出
子句的示例:
declare @ids table (id int);
update table1
set status = 1
output inserted.id into @ids
where status = 2;
update table2
set status = 1,
date = getdate()
where personid in (select id from @ids);
您可以使用
OUTPUT
子句更新第一个表,以捕获正在更新的记录。然后使用这些信息更新第二个表。为什么不简单地写两条update语句呢?如果您需要全部或不需要,可以将它们放入事务中。thx!这正是我所需要的。注意,outputstation应该在WHERE statemnet之前