Sql 如何使用单个查询更新多个表

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

我有两个表需要更新:

表A包括:ID、人名、日期、状态

表B包括:人名、日期、状态

对于A中的每一行,B中可以有多行具有相同的personID

我需要对状态为2的所有结果进行“循环”,并将日期和状态更新为1

此外,对于状态为2的A中的每一行,我需要更新B中具有相同personID(即A.ID==B.personID)的所有行–我还需要将日期和状态更新为1

因此,基本上,如果我要以编程(或算法)的方式来做这件事,它是这样的:

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之前