SQLCommand的ExecuteNonQuery方法最大的CommandText长度是多少?

9

我在互联网上搜索了很多内容,但都只是关于单个字段或执行一个插入操作的。我有一个迁移工具,正在将旧的遗留数据库(superbase)迁移到我们的SQL Server DB(2008)。目前,我正在从旧数据库中读取20,000条记录,并生成一个由分号分隔的包含20,000个插入语句的大型SQLCommand.CommandText字符串。这样做很好用。但是我能做到25k吗?30k?我尝试没有任何限制地运行,但当我尝试使用包含超过4百万个INSERT语句的CommandText运行ExecuteNonQuery时,它会显示一些关于太长的错误消息。我不记得确切的错误消息了,抱歉。我找不到任何关于确切限制的文档。对我来说很重要,因为我可以一次性提交更多的插入操作,整个过程会更快。非常感谢您提供的任何建议/链接/文档!


我也想到了,但是我现在遇到的问题是找到实际的最大查询大小。 - DontFretBrett
我认为它是64K *数据包大小。但是,除了使用20,000个单独的插入语句外,您是否考虑过:(a)将其分成较小的批次,(b)使用VALUES()将其分成20个INSERT语句? (c)使用SSIS或其他比20,000个单独的INSERT语句更擅长生成批量操作的工具? - Aaron Bertrand
另外,为什么你需要“回忆”确切的错误信息呢?难道你不能重现问题,然后复制并粘贴错误消息,而无需调用自己的记忆吗?无论应用程序语言中的字符串长度有何问题,在任何情况下都不应该发送400万个INSERT语句 - Aaron Bertrand
将其分成较小的批次是最初的问题。在一个ExecuteNonQuery中完成的插入越多,迁移速度就越快。我可以重现这个问题,但需要大约15个小时。这是一个漫长的故事。从SuperBase中获取数据需要使用他们痛苦缓慢的ODBC驱动程序。根据查询,我们需要花费像5分钟来收集1000条记录。我不知道如何使用SSIS或任何工具,因为这个数据库已经20年了,除了我会进一步研究它。 - DontFretBrett
古老的格言。从来没有时间做对,从来没有时间修复它。(:)->-< - CRAFTY DBA
显示剩余3条评论
2个回答

7

这取决于SQL Server的版本。

http://technet.microsoft.com/en-us/library/ms143432.aspx

对于SQL Server 2012,批处理大小或SQL语句(字符串)= 65536 * 网络数据包大小。

网络数据包大小是用于应用程序和关系数据库引擎之间通信的表格数据流(TDS)数据包的大小。默认数据包大小为4 KB,并由网络数据包大小配置选项控制。

简而言之,64K x 4K = 256 MB。同样,这假设您正在使用默认数据包大小。


没错。请给我答案的功劳。祝编程愉快! - CRAFTY DBA
我会测试这个,一旦成功,很乐意给你信用。我感激不尽。 - DontFretBrett
不熟悉TOAD(我不是DBA - 明显的)。我会调查一下TOAD的含义,但除此之外,我不知道如何重写这个过程,除了一次性发送256MB命令。 - DontFretBrett
好的,我不熟悉SuperBase。如果它是一个ODBC驱动程序,SSIS可以使用它。 http://technet.microsoft.com/en-us/library/hh758693.aspx - CRAFTY DBA
有没有办法对数据进行分区?例如,我发现如果启动一个DataWareHouse作业,需要10小时才能运行完。但是运行10个作业,每个作业只处理1/10的数据,只需要1小时就可以完成。这类操作取决于网络速度、CPU性能和磁盘速度。SuperBase是单线程应用程序吗? - CRAFTY DBA
显示剩余9条评论

1

我认为限制不在我的字符串长度上,因为错误出现在ExecuteNonQuery未设置CommandText行上。这似乎是SQL Server中的一种限制。我读到了一个叫做Maximum insert commit size的设置,但我不确定它是否与此有关,也不知道如何找到它以及该设置的最大值可设置为多少。 - DontFretBrett
没错,那个链接指的是SQL Server的限制。虽然线程中提到了字符串长度,但我引用的最后一条回复指的是SQL Server的限制。我认为那个限制大约是字符串最大长度的1/8。 - Tim
查询批处理的最大大小为65536 * 网络数据包大小。默认数据包大小为4096字节,因此上限为268百万字节。 有什么办法可以确定网络数据包的大小吗? - DontFretBrett
你们两个都是对的。256 MB大约等于2.68亿字节。65536 x 4096 = 268435456。说1MB等于100万字节就像说1升等于1夸脱一样。 - Cathy Sullivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接