2009-11-25 61 views
4

我有一個帶插入語句的SQL腳本來插入1000行(約12000個)。 當我嘗試在SSMS中運行腳本時,它會在一段時間後引發「內存不足」異常。使用SSMS將1000行的行插入到SQL表中

"An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown." 

我有Vista上的SQL Server 2008與3GB內存。

任何想法或指針,將不勝感激!

+1

你可以發佈腳本,至少簡化版嗎? – 2009-11-25 12:34:57

+0

是Express還是標準/ dev? – 2009-11-25 16:32:22

+0

是的,看到發生了很多次。請參閱下面的答案,瞭解我如何修復它。 – 2009-11-26 00:11:28

回答

2

這是一箇舊帖子,但沒有人似乎已經確定了明顯的問題。所以我想發佈一個可以幫助別人尋找答案的回覆。在SQL Server \ Properties \ Memory下,有一個「每個查詢最少內存」的設置。您可以暫時提高此號碼以幫助增加GO語句之間的記錄數量。在我的情況下,我提出了這個5000(10000導致系統內存不足的錯誤,不好),所以我解決了5000,經過幾次測試,我發現我現在可以導入大約20,000行,所以我放置一個GO語句每20,000行(大約需要10分鐘),並且我能夠在一個查詢中導入超過200,000行。

快樂編碼,羅布

1

您可能需要插入奇數commit以便不填滿事務日誌。

+0

@paxdiablo:你的意思是說,這些行需要拆分成多個事務? – pencilslate 2009-11-25 06:54:57

+0

是的,就像一般的建議一樣,不是回答你的具體問題(這就是爲什麼我把它變成一個社區維基)。只有當他們實際上是一個交易開始。我知道DB2會自動啓動事務,如果您不手動執行它 - 可能是SQL Server不這樣做,而是將每個插入作爲單個工作單元處理。 – paxdiablo 2009-11-25 07:14:48

3

System.OutOfMemoryException是一個CLR異常,而不是SQL Server異常。 SQL會引發一個錯誤701,並且它不會從簡單地執行一些insrts開始就耗盡內存。

事實上,你得到一個CLR異常表明這個問題可能在SSMS本身。確保您的腳本不會將錯誤的結果集和消息返回給SSMS。另外,請嘗試從sqlcmd執行腳本。

+0

他的錯誤是正確的。 SQL Management Studio(SSMS)運行內存不足,並在其中運行.Net代碼。 – 2009-11-26 00:06:47

4

你將不得不拆分命令。最簡單的方法是每10行添加一個GO。

基本上SSMS試圖加載所有的文本到一個單一 SqlCommand.CommandText並執行它。這是行不通的。

您需要將它們批量處理。在SSMS中,GO是一個簡單的分割點,它將佔用該點並執行它,然後繼續。

LINE1 LINE2

...
GO

LINE11
LINE12

這將在2個SqlCommands到數據庫中運行。
如果您需要將它們全部運行在單個事務中,您可能必須編寫命令行應用程序來加載每行並在事務中執行它。我不認爲你可以在SSMS內的執行中拆分交易。

你也可以建立一個SSIS包,但這是很多工作,我不推薦它,除非你需要每隔一段時間重複一次這個過程。

0

確保您使用SET NOCOUNT ON;

相反的:

INSERT ... VALUES (...) 
    INSERT ... VALUES (...) 
    INSERT ... VALUES (...) 

你可以或者嘗試使用以下,這可以作爲一個單一的隱式事務構建腳本(避免了需要運行的每個刀片之間COMMIT):

INSERT ... SELECT ... 
    UNION ALL SELECT ... 
    UNION ALL SELECT ... 

但是,如果整個腳本對於SSMS來說仍然太大(我想你會插入一些冗長的字符串),那麼你唯一的選擇就像其他人提出的那樣......分割你的腳本或使用不同的工具。

1

修復竟然是批量運行插入語句。我做了一些試驗來確定我在交易中可以做的最大數量的插入。

因此,對我而言,修復工作是將插入語句拆分爲更小的組(5000),並將它們標記爲具有提交的事務。對所有組別重複相同。它沒有給出'內存不足'異常。

但在黑暗的一面,我花了2小時插入50,000行,這讓我感到吃驚。有沒有辦法在短時間內完成?

欣賞您的所有評論。特別是paxdiablo和Jason Short指出解決方案和其他人推理原因。

0

我用光標將通過調用存儲過程裏面 但失敗了內存不足的異常

我把在最後的存儲過程去的它增加了一些性能

末改變網查看文本視圖在管理工作室它工作得很好。

0

打開>任務管理器>關閉SSMS服務

然後再次打開SSMS工作室 現在可以運行你的查詢。