如何导入大型 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 

只需将&lt;server&gt; 替换为您的SQL 框的位置,将&lt;your file here&gt; 替换为您的脚本名称。不要忘记,如果您使用的是 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 &lt;Servername&gt; -U &lt;Username&gt; -P &lt;password&gt; -d &lt;Databasename&gt; -i &lt;filename&gt; 您通过设置数据包大小解决了哪个问题?微软说:“更大的数据包大小可以提高性能......”(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 文件?的主要内容,如果未能解决你的问题,请参考以下文章

mysql怎么导入大型sql文件

如何将数据库从数百 MB 的大型 SQL 文件导入 MySQL

将大型 .sql 文件导入数据库 - 重复超时错误 phPMYAdmin

如何在mysql中批量导入大的sql文本文件

导入大型 sql 文件时 MySQL 服务器已消失

导入大型 sql 文件时 MySQL 服务器已消失