SQL Server - 运行大型脚本文件

69

我在开发服务器上有一个数据库表,现在已经完全填充了,因为我使用CSV文件进行导入,包含了1.4百万行。

我在该表上运行了数据库发布向导,现在我在本地机器上有一个286MB的SQL脚本。问题是,我不知道如何运行它。如果我将其加载到SQL Server Management Studio Express中,我会收到一个警告窗口,显示“操作无法完成”。

你有什么想法可以让我运行这个SQL脚本吗?


1
我在DBA上问了一个类似的问题,并收到了一些很好的反馈(http://dba.stackexchange.com/questions/16763/how-do-i-run-a-large-script-with-many-inserts-without-running-out-of-memory/)。 - spaghetticowboy
6个回答

173

使用sqlcmd工具来执行文件。

sqlcmd -S myServer\instanceName -i C:\myScript.sql

如果您在处理大于100MB的包含多个INSERT语句的SQL文件时,遇到了“脚本错误”,只需在文件中将 "INSERT INTO" 替换为 "GO INSERT INTO" 即可缩小事务大小。


1
使用这种方法时,我会收到“Sqlcmd:错误:脚本错误”的错误。这与文件大小有关吗? - tags2k
首先检查连接性。也许你需要通过用户名和密码(-U -P选项)进行认证。你可以试着用一个较小的文件再次运行程序。我已经运行过很大的脚本而没有任何问题。 - Gulzar Nazim
如果我只保留15个INSERT语句,它就能正常工作。但是如果我把其他的1,410,472个语句放回去,它就会出现错误信息。 - tags2k
1
这些语句都在一个事务中吗?也许是超时了。在运行之前尝试将超时设置为0(无限)。 - Gulzar Nazim
这里正在进行一些活动,讨论大文件文本编辑器的问题。http://stackoverflow.com/questions/222853/notepad-replacement-for-viewing-very-large-text-files - Gulzar Nazim
sqlcmd 加载整个文件,不幸的是。实际上,它似乎消耗的内存比文件大小要多得多。 - usr

18

9
如果你仍然遇到问题,请参考Gulzar Nazim的回答,尝试使用选项-f指定SQL文件的代码页

sqlcmd -S myServer\instanceName -d databaseName -i C:\myScript.sql -f 65001

我尝试导入一个来自SQLite(默认为UTF-8)的.dump文件时,sqlcmd在遇到第一个特殊字符后就会抛出错误。-f 65001对我有帮助。


1
是的,我们可以这样做,我尝试了使用BCP(大容量复制程序)方法来避免内存不足问题。
注意:我在SQLServer 2014中尝试过。
在BCP中,首先需要将源数据库数据导出到bcp文件(位于本地目录文件夹中),然后需要将该bcp文件导入到源数据库中。

enter image description here

以下是简单易懂的步骤:
注意事项:
a)请确保目标数据库中有空表。
b)请确保C盘中存在Temp文件夹。
1)创建一个名为“Export_Data.bat”的批处理文件,并使用以下命令。
bcp.exe [Source_DataBase_Name].[dbo].[TableName] OUT "C:\Temp\TableName.bcp" -S "Computer Name" -U "SQL Server UserName" -P "SQL Server Password" -n -q 

暂停

2) 运行该批处理文件,结果会在Temp文件夹中生成一个bcp文件

3) 然后创建另一个名为Import_Data.bat的批处理文件,并使用以下命令

bcp.exe [Destination_DataBase_Name].[dbo].[TableName] IN "C:\Temp\TableName.bcp" -S "Computer Name" -U "SQL Server UserName" -P "SQL Server Password" -n -q 

暂停

出发啦!


1

为什么不直接使用DTS导入CSV文件呢?


首先需要对数据进行一系列处理,但我不希望在实时服务器上运行。因此,我需要将数据处理成简单的SQL脚本,以最小化该服务器所需的工作量。 - tags2k

-9

在单个事务中运行如此大的内容并不是一个好主意。因此,我建议将文件分成更小、更易管理的块。

另一个选择是查看一些其他直接导入CSV数据的方法。


9
古尔扎尔·纳齐姆的回答是最好的答案。 - Feryt
9
@feryt,那可能是你的观点,但这不是OP决定的,而且Michael喜欢别人的答案并不是他的错(即使其他答案没有解决OP的问题)。 - Aaron Bertrand

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