如何导入大型 MS SQL .sql 文件?
Posted
技术标签:
【中文标题】如何导入大型 MS SQL .sql 文件?【英文标题】:How do you import a large MS SQL .sql file? 【发布时间】:2010-09-30 17:19:24 【问题描述】:我使用 RedGate SQL 数据比较并生成了一个 .sql 文件,因此我可以在本地计算机上运行它。但问题是文件超过 300mb,这意味着我无法复制和粘贴,因为剪贴板无法处理它,当我尝试在 SQL Server Management Studio 中打开文件时出现错误关于文件太大。
有没有办法运行一个大的 .sql 文件?该文件基本上包含两个新表的数据。
【问题讨论】:
【参考方案1】:在命令行使用 osql 运行,见这里:
http://metrix.fcny.org/wiki/display/dev/How+to+execute+a+.SQL+script+using+OSQL
【讨论】:
注意sqlcmd
替换 osql
。【参考方案2】:
在命令提示符下,启动sqlcmd
:
sqlcmd -S <server> -i C:\<your file here>.sql
只需将<server>
替换为您的SQL 框的位置,将<your file here>
替换为您的脚本名称。不要忘记,如果您使用的是 SQL 实例,语法是:
sqlcmd -S <server>\instance.
这是您可以传递 sqlcmd 的所有参数的列表:
Sqlcmd [-U login id] [-P password]
[-S server] [-H hostname] [-E trusted connection]
[-d use database name] [-l login timeout] [-t query timeout]
[-h headers] [-s colseparator] [-w screen width]
[-a packetsize] [-e echo input] [-I Enable Quoted Identifiers]
[-c cmdend] [-L[c] list servers[clean output]]
[-q "cmdline query"] [-Q "cmdline query" and exit]
[-m errorlevel] [-V severitylevel] [-W remove trailing spaces]
[-u unicode output] [-r[0|1] msgs to stderr]
[-i inputfile] [-o outputfile] [-z new password]
[-f | i:[,o:]] [-Z new password and exit]
[-k[1|2] remove[replace] control characters]
[-y variable length type display width]
[-Y fixed length type display width]
[-p[1] print statistics[colon format]]
[-R use client regional setting]
[-b On error batch abort]
[-v var = "value"...] [-A dedicated admin connection]
[-X[1] disable commands, startup script, environment variables [and exit]]
[-x disable variable substitution]
[-? show syntax summary]
【讨论】:
我有一些插入,例如:INSERT INTO table_name (text) VALUES ('some text bla bla 'bla' text')
。我有引号错误。那么我必须使用什么(哪个参数)来处理这个错误?谢谢
我们可以将脚本保存在外部驱动器上吗?像 E:开车?而不是 C 盘?
这对我有用,但最后我不得不去掉 -o
仅供参考,SQL Server 2008 R2,运行文件从 400MB 到 6GB;按预期工作。
运行75G sql文件失败。【参考方案3】:
你的问题和this one很相似
您可以将文件/脚本保存为 .txt 或 .sql 并从 Sql Server Management Studio 运行它(我认为菜单是 Open/Query,然后只需在 SSMS 界面中运行查询)。您可能必须更新第一行,指示要在本地计算机上创建或选择的数据库。
如果您必须经常进行此数据传输,则可以进行复制。根据您的需要,快照复制可能没问题。如果您必须在两台服务器之间同步数据,则可以采用更复杂的模型,例如合并复制。
编辑:我没有注意到与文件大小相关的 SSMS 存在问题。然后您可以按照其他人的建议使用命令行,快照复制(在您的主服务器上发布,在您的本地服务器上订阅,复制,然后取消订阅)甚至备份/恢复
【讨论】:
Jack 提到他无法从 SSMS 执行此操作,因为文件太大。【参考方案4】:该文件基本上包含两个新表的数据。
如果两台服务器在同一个网络上,那么您可能会发现只使用 DTS(或 SSIS,如果这是 SQL Server 2005+)数据更简单。
如果两台服务器不在同一个网络上,您可以备份源数据库并将其还原到目标服务器上的新数据库。然后可以使用DTS/SSIS,甚至是简单的INSERT INTO SELECT
,将两张表传输到目标数据库。
【讨论】:
如果一个或两个表生成一个那么大的文件,可以安全地假设数据库是几个 Gig,这使得备份和恢复在许多情况下不可行。【参考方案5】:我也遇到了同样的问题,苦苦挣扎了一阵子,终于找到了解决方案,就是将-a
参数设置为sqlcmd
,以改变其默认数据包大小:
sqlcmd -S [servername] -d [databasename] -i [scriptfilename] -a 32767
【讨论】:
+1 用于在示例中添加 -d 选项。我在我的 sql 文件中使用了“USE [DBNAME]”。这也很有效。不确定哪个是更好或首选的方法 谢谢。我使用以下命令作为连接数据库所需的用户名和密码。sqlcmd -S <Servername> -U <Username> -P <password> -d <Databasename> -i <filename>
您通过设置数据包大小解决了哪个问题?微软说:“更大的数据包大小可以提高性能......”(docs.microsoft.com/en-us/sql/tools/sqlcmd-utility)
@TheincredibleJan 我想他指的是这个:***.com/q/55881713/345659【参考方案6】:
您也可以使用此工具。真的很有用。
BigSqlRunner
【讨论】:
我认为它也很有用,直到我用一个 400 MB 的 SQL 文件(充满了 INSERT 语句)运行它。运行 9 小时后,没有向数据库添加任何内容,但 BigSqlRunner 消耗了 3 GB 到 6 GB 的内存。 非常有用。通常我手动将文件(各种工具)拆分成块,然后手动编辑它们,使 sql 语句是“完整的”,然后通过批处理脚本执行。这让它变得如此简单。 2.3gb .sql 文件,很简单。【参考方案7】:以管理员权限获取命令提示符
将目录更改为 .sql 文件的存储位置
执行以下命令
sqlcmd -S 'your server name' -U 'user name of server' -P 'password of server' -d 'db name'-i script.sql
【讨论】:
【参考方案8】:我使用的是 MSSQL Express 2014,但没有一个解决方案适合我。他们都只是崩溃了SQL。因为我只需要运行一个包含许多简单插入语句的一次性脚本,所以我通过编写一个小控制台应用程序作为最后的手段来解决它:
class Program
static void Main(string[] args)
RunScript();
private static void RunScript()
My_DataEntities db = new My_DataEntities();
string line;
System.IO.StreamReader file =
new System.IO.StreamReader("c:\\ukpostcodesmssql.sql");
while ((line = file.ReadLine()) != null)
db.Database.ExecuteSqlCommand(line);
file.Close();
【讨论】:
【参考方案9】:希望对您有所帮助!
sqlcmd -u UserName -s <ServerName\InstanceName> -i U:\<Path>\script.sql
【讨论】:
-U -P 选项命令应该是大写而不是小写【参考方案10】:我有类似的问题。我的 sql 脚本文件大小超过 150MB(几乎 900k 的非常简单的 INSERTs)。我使用了 Takuro 建议的解决方案(作为此问题的答案),但我仍然收到错误消息,提示内存不足(“资源池'内部'中的系统内存不足,无法运行此查询”)。
对我有帮助的是,我在每 50k INSERTs 之后放置 GO 命令。
(它不是直接解决问题(文件大小),但我相信它解决了与大型 sql 脚本本身间接相关的问题。在我的情况下,许多插入命令)
【讨论】:
【参考方案11】:==> sqlcmd -S [服务器名] -d [数据库名] -i [脚本文件名] -a 32767
我已经用 365mb 的 sql 文件成功完成了这个命令。 此语法运行大约 15 分钟。 它帮助我解决了一个我花了很长时间才弄清楚的问题
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于如何导入大型 MS SQL .sql 文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据库从数百 MB 的大型 SQL 文件导入 MySQL