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个单独的查询运行。
谢谢。
答
从我与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
将恢复模式设置为简单恢复。这应该有助于日志溢出。 –
不幸的是,这是我的DBA的工作,我不能那样做。我关心的是查询本身。 – sqlearner
如果您正在使用'INSERT INTO',则会覆盖现有的2016年数据,但不会2017年的数据_没有意义。在运行“2015年