使用SSMS将1000行插入SQL表

时间:2009-11-25 06:45:02

标签: sql sql-server-2008 ssms

我有一个带有insert语句的sql脚本,可插入1000行(约12000行)。 当我尝试在SSMS中运行脚本时,它会在一段时间后抛出“Out of memory”异常。

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

我在Vista上安装了3GB RAM的SQL Server 2008。

任何想法或指示都将不胜感激!

8 个答案:

答案 0 :(得分:4)

您必须拆分命令。最简单的方法是每10行左右添加一个GO。

基本上SSMS正在尝试将所有文​​本加载到单个 SqlCommand.CommandText中并执行它。那不行。

你需要让它批处理它们。 GO是SSMS中的一个简单分割点,它将占用该点并执行它,然后继续。

LINE1
LINE2
...
GO

LINE11
LINE12

这将在2个SqlCommands中运行到数据库 如果您需要它们都在单个事务中运行,您可能必须编写命令行应用程序来加载每一行并在事务中执行它。我不认为您可以在SSMS中跨执行分割事务。

您也可以构建一个SSIS包,但这是很多工作,除非您需要经常重复此过程,否则我不推荐它。

答案 1 :(得分:3)

System.OutOfMemoryException是一个CLR异常,而不是SQL Server异常。 SQL会引发错误701,除此之外,只需执行一些insrts就不会耗尽内存。

您获得CLR异常的事实表明问题可能出在SSMS本身。确保您的脚本不会将虚假结果集和消息返回给SSMS。另外,尝试从sqlcmd执行脚本。

答案 2 :(得分:2)

这是一个老帖子,但似乎没有人发现明显的问题。所以我想发布一个可能有助于搜索答案的人的回复。在SQL Server \ Properties \ Memory下,有一个每个查询的最小内存设置。您可以暂时提高此数字,以帮助增加GO语句之间的记录数。在我的情况下,我把它提高到5000(10000导致系统内存错误,不好)所以我安顿了5000,经过几次测试后我发现我现在可以导入大约20,000行所以我每隔20,000行放置一个GO语句(花了大约10分钟),我能够在一个查询中导入超过200,000行。

快乐编码,Rob

答案 3 :(得分:1)

您可能需要插入奇数commit以便不填写事务日志。

答案 4 :(得分:1)

该修复程序结果是批量运行insert语句。我做了一些实验,以确定我可以在交易中完成的最大插入次数。

因此,对我有用的修复方法是将insert语句拆分为较小的组(5000)并将其标记为带提交的事务。对所有组重复相同的操作。它没有给出“内存不足”的例外情况。

但是在较暗的一面,我花了2小时插入50,000行,这让我感到惊讶。有没有办法可以在更短的时间内完成它?

感谢您的所有评论。特别是paxdiablo和Jason Short指出解决方案和其他所有人推理原因。

答案 5 :(得分:0)

确保使用SET NOCOUNT ON;

而不是:

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

您也可以尝试使用以下代码构建脚本,它作为单个隐式事务工作(避免在每个插入之间运行COMMIT):

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

但是,如果整个脚本仍然太大而无法处理SSMS(我想你正在插入一些冗长的字符串),那么你唯一的选择就像其他人建议的那样......分割你的脚本或者使用不同的工具

答案 6 :(得分:0)

我通过调用其中的存储过程来插入游标 但失败的内存异常

我把 go 放在最后一个存储过程中,它增加了一些性能

最近在管理工作室中将网格视图更改为文字视图工作正常。

答案 7 :(得分:0)

打开>任务管理器>关闭SSMS服务

然后再次打开SSMS工作室 现在您可以运行查询。