在SQL Server 2008中使用Insert语句插入大量数据时出错

时间:2015-02-10 06:42:01

标签: sql sql-server sql-server-2008 insert bulkinsert

我试图将记录插入表中有大量数据

文件说明:

Size : 65.0 MB
Records count : 10000

我的样本数据:

INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO
INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO
INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO
INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO
.......
INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO
INSERT INTO tbldata(col1,col2,col3)values(col1,col2,col3)
GO 
.......
UPTO 10000 ROWS

ERROR:

Exception of type 'System.OutOfMemoryException' was thrown.(mscorlib)

我试过: I verified this answer

在SQL Server \ Properties \ Memory下,有一个每个查询的最小内存设置。您可以暂时提高此数字,以帮助增加GO语句之间的记录数。在我的情况下,我把它提高到5000(10000导致系统内存错误,不好)所以我安顿了5000,经过几次测试后我发现我现在可以导入大约20,000行所以我每隔20,000行放置一个GO语句(花了大约10分钟),我能够在一个查询中导入超过200,000行。

1 个答案:

答案 0 :(得分:0)

SQL Server 2005的最大批处理大小为65,536 *网络包大小(NPS),其中NPS通常为4KB。这可以达到256 MB。这意味着你的insert语句平均每个5.8 KB。这似乎不对,但也许那里有无关的空间或不寻常的东西。

我的第一个建议是在每个INSERT语句后放置一个“GO”语句。这会将您的一批45,000个INSERT语句分成45,000个单独的批次。这应该更容易消化。小心,如果其中一个插入失败,你可能很难找到罪魁祸首。您可能希望通过交易来保护自己。如果您的编辑器具有良好的搜索和替换(可以让您搜索和替换返回字符,如\ r \ n)或宏工具,则可以快速添加这些语句。

第二个建议是使用向导直接从Excel导入数据。该向导在幕后为您构建一个小的SSIS包,然后运行它。它不会有这个问题

引用来自此Out of memory exception