SQL Server - INSERT INTO覆盖现有数据

问题描述:

我有一个奇怪的问题在这里,我试图加载一些数据到SQL Server中的新表。该表自2015年至今已有几百万条记录。当我尝试加载整个数据时,它会在停止前运行约2小时并引发错误SQL Server - INSERT INTO覆盖现有数据

事务日志 - 完整。

那么我现在要做的是打破了时间框架分为两个部分在WHERE条款 YEAR >= 2016并插入值,然后修改INSERT声明 YEAR >= 2015 AND YEAR < 2016。当我执行此操作时,它会覆盖现有的2016年数据,但不会覆盖2017年的数据。所以基本上整个2016年没有收益。

我错过了什么吗?

这真的很烦人,因为我最终花费数小时才加载数据。

代码

INSERT INTO <tablename> 
    SELECT * 
    FROM 
     (SELECT <columnnames> 
     FROM <few join statements> 
     WHERE <calendaryear >= 2016 
     GROUP BY <statements>) a -- this loads data from 2016 to present. 

INSERT INTO <tablename> 
    SELECT * 
    FROM 
     (SELECT <columnnames> 
     FROM <few join statements> 
     WHERE <calendaryear >= 2015 AND calendaryear < 2016 
    GROUP BY <statements>) a --this loads data from 2015 to 2016 

执行前一个被覆盖的第二条语句后。在这里,我将其显示为2个单独的查询,但实际上我只是将日历报表注释掉并作为2个单独的查询运行。

谢谢。

+0

将恢复模式设置为简单恢复。这应该有助于日志溢出。 –

+0

不幸的是,这是我的DBA的工作,我不能那样做。我关心的是查询本身。 – sqlearner

+0

如果您正在使用'INSERT INTO',则会覆盖现有的2016年数据,但不会2017年的数据_没有意义。在运行“2015年

以前的陈述有没有可能被提交?第二个陈述之前发生了回滚?

+0

不,我不这么认为。有没有可能?我实际上在生产服务器的沙箱内工作。 – sqlearner

+0

除非您明确使用transact语句,否则如果第一条语句填满日志,则会生成错误,并且第一条语句会回滚。如果第二条语句不会导致日志填满,则第二条语句将成功运行。我认为您需要找到绕过日志的方法,或者让您的dba增加日志大小,否则您将永远试图将您的查询分解为足够小的块。 – LAS

从我与SQL Server一起工作了几年,但我相信命令BCP(批量加载)将绕过日志。你不应该需要一个DBA。

尝试以下操作:

USE [YOUR_DB] 
GO 

SELECT log_reuse_wait,log_reuse_wait_desc from sys.database 

这应该给你一个线索,为什么日志文件被填满。

https://msdn.microsoft.com/en-us/library/ms345414(v=sql.105).aspx