2017-07-24 520 views
0

我有一個奇怪的問題在這裏,我試圖加載一些數據到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年<=年和年<2016年」之前,您是否檢查過目標表中是否有2016年數據? –

回答

0

以前的陳述有沒有可能被提交?第二個陳述之前發生了回滾?

+0

不,我不這麼認爲。有沒有可能?我實際上在生產服務器的沙箱內工作。 – sqlearner

+0

除非您明確使用transact語句,否則如果第一條語句填滿日誌,則會生成錯誤,並且第一條語句會回滾。如果第二條語句不會導致日誌填滿,則第二條語句將成功運行。我認爲您需要找到繞過日誌的方法,或者讓您的dba增加日誌大小,否則您將永遠試圖將您的查詢分解爲足夠小的塊。 – LAS

0

從我與SQL Server一起工作了幾年,但我相信命令BCP(批量加載)將繞過日誌。你不應該需要一個DBA。