SQL Server:使用临时表中的数据为200K行更新两个表

时间:2014-03-27 17:05:40

标签: sql-server

我在xls中有200K +行数据,并且根据需要我需要使用xls数据更新数据库表(2个表)。 我知道将数据从xls复制到SQL服务器表的过程,但我正在努力使用更新数据库表的方法。

我想不出除了编写游标之外的任何其他方法,我不想将光标方法作为更新 使用光标的200k +数据可能会占用事务日志,并且需要很长时间才能完成更新。

有人可以帮助我做其他事情来实现这一目标。

1 个答案:

答案 0 :(得分:0)

使用以下技术。

1 - 将数据导入临时表。使用导入/导出工具是执行任务的一种方法目标表应该在丢弃或临时数据库中。

http://technet.microsoft.com/en-us/library/ms141209.aspx

2 - 确保EXCEL数据和TABLE数据之间的数据类型相同。

3 - 确保现有目标[TRG_TBL] TABLE具有主键。确保加载到[SRC_TBL]表中的EXCEL数据具有相同的密钥。您可以添加非聚集索引以加速UPDATE语句中的JOIN。

4 - 使用ALTER TABLE命令将[FLAG]列作为INT NULL添加到[TRG_TABLE]。

5 - 确保在大型UPDATE之前和之后完成完整备份。您还可以使用DATABASE SNAPSHOT。关键是在需要时制定回滚计划。

-- Select correct db
USE [TRG_DB]
GO

-- Set to simple mode
ALTER DATABASE [TRG_DB] SET RECOVERY SIMPLE;
GO

-- Update in batches
DECLARE @VAR_ROWS INT = 1;

WHILE (@VAR_ROWS > 0)
BEGIN
      -- Update fields and flag on join
      UPDATE TOP (10000) T
      SET
        T.FLD1 = S.FLD1,
        -- ... Etc
        T.FLAG = 1
      FROM [TRG_TABLE] T JOIN [SRC_TABLE] S ON T.ID = S.ID
      WHERE T.[FLAG] IS NULL

      -- How many rows updated
      SET @VAR_ROWS = @@ROWCOUNT;

      -- WAL -> flush log entries to data file
      CHECKPOINT;
END

-- Set to full mode
ALTER DATABASE [MATH] SET RECOVERY FULL;
GO

总之,我给了你完成这项工作的所有工具。只需根据您的特定情况修改它们。

PS:这是我博客上关于大型删除的工作代码。同样的逻辑适用。

http://craftydba.com/?p=3079

PPS:我没有检查示例代码的语法。这是留给你的。