Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SSMS向SQL表插入1000行_Sql_Sql Server 2008_Ssms - Fatal编程技术网

使用SSMS向SQL表插入1000行

使用SSMS向SQL表插入1000行,sql,sql-server-2008,ssms,Sql,Sql Server 2008,Ssms,我有一个带有insert语句的sql脚本,可以插入1000行(大约12000行)。 当我尝试在SSMS中运行脚本时,它会在一段时间后抛出“内存不足”异常 "An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown." 我在Vista上安装了带有3gb内存的SQL Server 2008 任何想法或建议都将不胜感激 您可

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

"An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown."
我在Vista上安装了带有3gb内存的SQL Server 2008


任何想法或建议都将不胜感激

您可能需要插入奇数
提交
,以便不填充事务日志。

System.OutOfMemoryException是CLR异常,而不是SQL Server异常。SQL将引发错误701,而且它不会因为简单地执行一些INSRT而耗尽内存


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

您将不得不拆分命令。最简单的方法是每隔10行左右添加一次围棋

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

你需要用它来批量生产。GO是SSMS中的一个简单拆分点,它将占用该点并执行它,然后继续

第1行
第2行
...

第11行
第12行

这将在数据库的2个SqlCommands中运行。
如果您需要在一个事务中运行它们,您可能需要编写一个命令行应用程序来加载每一行并在事务中执行它。我认为您无法在SSM内跨执行拆分事务


您也可以构建SSIS包,但这需要大量工作,我不建议您这样做,除非您需要经常重复此过程。

确保使用SET-NOCOUNT ON

而不是:

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


但是,如果整个脚本对于SSM来说仍然太大而无法处理(我想您正在插入一些长字符串),那么您唯一的选择就是其他人所建议的。。。拆分脚本或使用其他工具。

修复程序结果是成批运行insert语句。我做了一点实验来确定在一个事务中可以插入的最大数量

因此,对我有效的修复方法是将insert语句分成更小的组(5000),并用commit将它们标记为事务。对所有组重复相同的步骤。它工作时没有出现“内存不足”异常

但在黑暗的一面,我花了2个小时才插入50000行,这让我大吃一惊。有没有一种方法可以让我在更短的时间内完成


谢谢你的评论。具体地说,paxdiablo和Jason是指向解决方案和其他人的缩写,用于推断原因。

我是通过调用游标中的存储过程来插入游标的 但由于内存不足异常而失败

我在上一个存储过程中使用了go,它提高了一些性能


上次在management studio中将网格视图更改为文本视图,效果很好。

这是一篇老文章,但似乎没有人发现明显的问题。所以我想发布一个回复,可能有助于人们寻找答案。在SQL Server\Properties\Memory下,设置了每个查询的最小内存。您可以临时提高此数字,以帮助增加GO语句之间的记录数。在我的例子中,我将这个值提高到5000(10000导致系统内存不足错误,不太好),所以我选择了5000,在几次测试之后,我发现我现在可以导入大约20000行,所以我每20000行放置一个GO语句(大约10分钟),并且我能够在一个查询中导入200000多行


快乐编码,Rob

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

然后再次打开SSMS studio
现在您可以运行您的查询了。

@paxdiablo:您的意思是说,行需要拆分为多个事务吗?是的,只是作为一般建议,而不是作为您特定问题的答案(这就是我将其设置为社区wiki的原因)。只有当它们实际上是一个交易开始时。我知道,如果不手动执行,DB2会自动启动事务—可能是SQL Server没有这样做,而是将每个插入视为一个单独的工作单元。您是否可以发布脚本,至少是简化版本?是Express还是standard/dev?是的,这种情况已经发生过很多次了。请看下面我的答案,了解我是如何修正的。他的错误是正确的。SQL Management Studio(SSMS)内存不足,并且在其中运行.Net代码。
  INSERT ... SELECT ...
  UNION ALL  SELECT ...
  UNION ALL  SELECT ...