这个问题实际上似乎经常出现在这里.
Mark有正确的(也是最常用的)答案,但是让我尝试添加我能做的更清楚的答案.
错误消息有点误导. sql Server告诉您它没有足够的内存来运行查询,但它的真正含义是它没有足够的内存来解析查询.
在运行查询时,sql Server可以使用它想要的所有内容 – 如果需要,可以使用千兆字节.解析是另一个故事;服务器必须构建一个解析树,并且只有非常有限的内存可用.我从来没有发现任何地方记录的实际限制,但对于一个典型的批处理INSERT语句,它一次不能处理超过几MB.
所以我很遗憾地告诉你这个,但是你不能让sql Server完全按照它编写的那样执行这个脚本.没有办法,没有办法,无论你调整什么设置都没关系.但是,您可以使用许多选项来解决它:
具体来说,您有三个选择:
>使用GO语句.这被SSMS和各种其他工具用作批处理分隔符.不是为整个脚本生成单个解析树,而是为由GO分隔的批次的每个段生成单独的解析树.这是大多数人所做的事情,并且使脚本在事务上安全非常简单,正如其他人所证明的那样,我在此不再重复.
>不是生成大量脚本来插入所有行,而是将数据保存在文本文件中(即以逗号分隔).然后使用bcp utility导入它.如果您需要“可编写脚本” – 即导入需要在与CREATE TABLE语句相同的脚本/事务中进行,则使用BULK INSERT代替.虽然BULK INSERT是一个非记录操作,不管你信不信,它仍然可以放在一个BEGIN TRAN / COMMIT TRAN块中.
>如果你真的,真的希望INSERT成为一个记录操作,并且不希望批量发生插入,那么你可以使用OPENROWSET打开一个文本文件,excel文件等作为ad-hoc“表“,然后将其插入到新创建的表中.我通常不愿意推荐使用OPENROWSET,但由于这显然是一个管理脚本,因此它并不是一个主要问题.
之前的评论表明你对#1感到不舒服,尽管这可能只是因为不能在一次交易中做错的假设,在这种情况下请参见Thomas的回答.但是,如果你已经走了另一条道路,我建议选择#2,创建一个文本文件并使用BULK INSERT. “安全”脚本的一个示例是:
BEGIN TRAN
BEGIN TRY
CREATE TABLE MyTable (...)
BULK INSERT MyTable
FROM 'C:\Scripts\Data\MyTableData.txt'
WITH (
FIELDTERMINATOR = ',',ROWTERMINATOR = '\r\n',BATCHSIZE = 1000,MAXERRORS = 1
)
COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
希望这有助于您走上正确的轨道.我很确定这涵盖了你所有可用的“盒子里”选项 – 除此之外,你必须开始编写实际的应用程序或shell脚本来完成这项工作,我认为这种复杂程度并不高真的有理由在这里.