首页 > 解决方案 > 使用临时表连接的 SQL 批量更新

问题描述

我在有效地进行更新时遇到了一些麻烦。

让我列出我的问题。表people

卡ID 创建 修改的
1 1-1-2001 2005 年 1 月 1 日
2 1-1-2001 2005 年 1 月 1 日
3 1-1-2001 2005 年 1 月 1 日
4 1-1-2001 2005 年 1 月 1 日
5 1-1-2001 2005 年 1 月 1 日

我有一个像上面这样的表(有更多的列)几百万行。我需要更新大约一百万个修改日期以匹配创建的日期。

现在我想解决这个问题的方法是使用临时表/表变量来收集caIDs我想要更新的。

DECLARE @temp TABLE(
    id BIGINT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    caID BIGINT
)
INSERT INTO @temp
(
    caID
)

我现在已经使用了类似上面的东西。据我了解,我使用了一个额外的 id 列,我应该能够在批量更新中使用它,以确保我不会一遍又一遍地重复相同的行。

这就是一切都出错的地方。我在这个网站上看到了很多批量更新的例子,但我的问题是我想在 INNER JOIN 中使用 temp/var 表来更新主表。

UPDATE p
SET p.Modified = p.Created
FROM people p
JOIN @temp t ON t.caID = p.caID

我对如何批量更新它感到非常困惑,所以这里的任何提示或提示都将受到欢迎。

我想通过连接进行更新,因为我还有其他行要使用来自各种来源的信息进行更新,这些信息将以相同的方式完成。

如果有人对使用临时表等执行更新有意见,我也欢迎。这对很多东西来说还是相对较新的,我学得越多越好。

如果需要更多信息,请询问。

从其他地方找到了一个看起来不错的解决方案。

WHILE 1 = 1
BEGIN
    BEGIN TRANSACTION
        UPDATE TOP (1000) ca
        UPDATE p
        SET p.Modified = p.Created
        FROM people p
        JOIN @temp t ON t.caID = p.caID
        WHERE p.Modified <> p.Created
        IF @@ROWCOUNT = 0 -- terminating condition;
        BEGIN
            COMMIT TRANSACTION
            BREAK
        END
    COMMIT TRANSACTION
WAITFOR DELAY '00:00:00.300';
END

除了在临时表上建立索引外,这似乎工作得很好。

标签: sqlsql-serversql-updateinner-join

解决方案


推荐阅读