【问题标题】:Maximum size of .SQL file or variable for SQL server?SQL 服务器的 .SQL 文件或变量的最大大小?
【发布时间】:2013-11-30 11:27:24
【问题描述】:

我有一个大约 20MB 的 SQL 文件/SQL 字符串。 SQL 服务器根本无法接受这个文件。用于查询或插入数据到 SQL 服务器的 .SQL 文件或变量的最大大小是否有限制?

当我说变量时,是指通过某种编程语言甚至ETL工具将变量传递给SQL Server。

【问题讨论】:

  • 我以前用过sqlcmd 处理大(~20MB)文件,从来没有遇到过问题。与 SQL Studio 管理工具相同。
  • @PaulDraper - 大约 3 周前,我在管理工作室使用了一个 200Mb 的文件,但出现了一个奇怪的错误。我的查询没问题。有没有办法找到限制?
  • 好吧,看起来你正在这样做;)但说真的,我从未见过发布的限制。意识到这个答案将取决于使用的外部工具或库。
  • @PaulDraper - 这是从未得到解决的错误 - stackoverflow.com/questions/19647922/…

标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2000


【解决方案1】:

您可以使用 SQLCMD,但我刚刚使用该命令行工具遇到了 2GB 的文件大小限制。即使我在每个声明之后都有一个 GO。一旦超过 2GB 边界,我就会收到一个不正确的语法错误。

经过一番搜索,我找到了这个链接: https://connect.microsoft.com/SQLServer/feedback/details/272757/sqlcmd-exe-should-not-have-a-limit-to-the-size-of-file-it-will-process

上面的链接页面说 2GB 之后的每个字符都被忽略。这可以解释我的语法错误。

【讨论】:

    【解决方案2】:

    是的,我以前见过这个。 .sql 文件没有大小限制。它更多的是关于从那个 .sql 文件中执行什么样的逻辑。如果您有大量快速插入到一个小表中,例如:INSERT INTO myTable (column1) VALUES(1),那么您可以在一个 .sql 文件中运行数千个,而如果您在插入之外应用大量逻辑/删除然后您将遇到这些问题。文件的大小并不像文件中的内容那么重要。

    当我们过去遇到这些时,我们从 SQLCMD 运行 .sql 文件。很容易做到。您还可以在 C# 或 vb 中创建一个流读取器来读取 .sql 文件并构建要执行的查询。

    SQLCMD: SQLCMD -S [Servername] -E -i [SQL Script]

    够清楚了吗?如果您发布一个您正在尝试做的示例,那么我可以为您编写一些示例代码。

    当我第一次遇到这个问题时,我发现的唯一解决方案是将 .sql 文件拆分为更小的文件。这对我们的解决方案不起作用,但 SQLCMD 起作用了。后来我们实现了一个实用程序,它可以读取这些大文件并使用一些快速的 c# 编程和一个流读取器来执行它们。

    【讨论】:

    • 向表中插入大约 500K 次。只有长的插入语句,没有额外的逻辑,如 select、if-else 等。这些大的插入文件都没有执行。
    • 你是从 SQLCMD 运行的吗?成功了吗?如果您只是想查看文件,请使用记事本打开它。如果它没有打开,则说明文件存在问题。在记事本中打开时顶部有什么奇怪的字符?
    • 我不想使用 SQLCMD,因为该选项需要在服务器上更改很多设置。还有什么办法吗?根本没有奇怪的字符。
    • 如果您仅限于使用 SSMS,那么您可以将 sql 文件分解为更小的 sql 文件。对不起,我也讨厌这个答案。如果您可以使用 C# 实用程序,我会帮助您编写一个快速流阅读器来执行脚本。
    【解决方案3】:

    SQL 文件的大小应受 PC/工作站上可用内存的限制。但是,如果您不想使用 osql 和/或第三方工具,那么在 SSMS 中有一个解决方案。它被称为 SQLCMD 模式,它使您能够通过引用它来运行 SQL 文件,而不是真正在编辑器中打开它。

    基本上,您所要做的就是:

    1. Query 菜单中选择SQLCMD Mode
    2. 查找调用脚本的路径(大型 SQL 文件)
    3. 打开New Query(或使用现有的)并在新行中编写此代码

      :r D:\PathToMyLargeFile\MyLargeFile.sql

    4. 运行该(调用)脚本

    如果您需要在被调用脚本中使用变量,则必须在调用脚本中声明它。那么你的调用脚本应该是这样的:

    :setvar myVariable "My variable content"
    :r D:\PathToMyLargeFile\MyLargeFile.sql
    

    假设您调用的脚本将变量用于应该插入行的内容。那么它应该看起来像这样......

    INSERT INTO MyTable (MyColumn)
    SELECT '$(myVariable)'
    

    【讨论】:

      【解决方案4】:

      Pranav 在引用 Maximum Capacity Specifications for SQL Server 文章时走在了正确的轨道上;但是,执行查询的适用限制是:

      包含 SQL 语句的字符串的长度(批量大小)1 65,536 * 网络数据包大小

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

      此外,我发现在 SQL Server Management Studio 中执行大量 SQL 语句存在问题。 (有关相关问题,请参阅SQL Server does not finish execution of a large batch of SQL statements。)尝试将SET NOCOUNT ON 添加到您的 SQL 以防止发送不必要的数据。此外,在执行大量 INSERT 语句时,请尝试使用 GO 批处理分隔符将它们分成批处理。

      【讨论】:

      • 谢谢。是否保证 GO 会防止这个问题?如果是,那为什么?
      • 是的,GO 会避免这个问题。 GO 不是 SQL 语句 - 它是 Management Studio 或 sqlcmd 的命令,将语句发送到 GO 命令到 SQL Server 进行处理,等待结果,然后将下一组语句发送到下一个 GO,并且依此类推,直到文件末尾。您不能将 GO 放在代码块中(BEGIN/END) - 每个块必须是一组有效的语句。
      【解决方案5】:

      我认为您的担忧来自尝试在 SSMS 中打开文件。在 SSMS 中,打开一个 20mb 的文件可能会出现问题——这与尝试在记事本或大多数文本编辑器中打开同一个文件没有什么不同。

      为了记录 - 对于其他海报 - 我认为这些问题与 SQL 列、表、对象或数据库大小没有任何关系!这只是使用IDE的一个问题。

      如果文件是纯数据要导入,没有sql命令,尝试批量导入。

      如果文件是 SQL 命令,您将需要一个可以处理大文件的编辑器,例如 Vedit。 http://www.vedit.com/ 将无法执行sql。如上所述,您必须使用 sqlcmd 从命令行执行此操作。

      【讨论】:

        【解决方案6】:

        这里是few links, 2希望对你有帮助

        【讨论】:

        【解决方案7】:

        我通过 MSDN 上的这篇文章找到了“Maximum Capacity Specifications for SQL Server”,通过这个,我找到了:

        对于 Sql Server 2012、2008 R2、2005

        最大文件大小(数据):16 TB

        每个 varchar(max)、varbinary(max)、xml、text 或 image 列的最大字节数:2^31-1 字节 (~2048 GB)

        有关 SQL Server 最大容量规格的更多详细信息,请参阅:

        对于 SQL Server 2012: http://msdn.microsoft.com/en-us/library/ms143432(v=sql.110).aspx

        对于 SQL Server 2008 R2: http://msdn.microsoft.com/en-us/library/ms143432(v=sql.105).aspx

        对于 SQL Server 2005: http://msdn.microsoft.com/en-us/library/ms143432(v=sql.90).aspx

        对于 Sql server 2000,我不确定,因为 MSDN 似乎已经删除了相关文档。

        【讨论】:

        • 我认为这可能与我的案例有关 - “包含 SQL 语句的字符串的长度”(批量大小)。它说最大长度 = 65,536 * 网络数据包大小。一般网络数据包大小= 4kb。所以最大字符串大小= 256mb。但是,即使是 100、150 和 200mb 的文件对我来说也失败了。也许我的数据包很小?我怎么知道?
        • 数据包大小设置可以在通过网络发送数据的 web 服务中进行操作。根据您使用的技术,它会发生变化。例如在 .NET 的 WCF 中,我们在 web.config 中使用绑定,它可以指定这些设置,例如 <binding name="basicHttp" allowCookies="true" maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000"> <readerQuotas maxDepth="32" maxArrayLength="200000000" maxStringContentLength="200000000"/> </binding>
        • 我如何从 C# 程序中找出我的数据包大小?
        • 在 c# 中,如果您使用的是 Windows Communication Foundation(WCF),那么回答 stackoverflow.com/questions/966323/… stackoverflow.com/questions/11583882/… 和 msdn 链接 msdn.microsoft.com/en-us/library/ff647110.aspx 会有所帮助。如果您不使用服务,那么事情对您来说会很困难......
        • 我想在 SSIS 中使用 C# 脚本或在 Visual Studio 中使用独立脚本。
        【解决方案8】:

        从您的问题中不清楚 SQL 文件包含什么。我在下面建议的解决方案仅适用于您引用的 SQL 文件只有插入语句的情况。

        将大量数据插入 SQL Server 的最快方法是使用批量复制功能 (BCP BCP Utility)

        如果您有 SQL Server 管理工作室,那么您还应该在 C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Binn(或等效项)中查看 bcp 实用程序。

        如果您想使用 BCP 实用程序,则需要创建一个包含数据的文件,该文件可以用逗号分隔。请参阅 bcp 文档了解文件的外观。

        【讨论】:

          【解决方案9】:

          有关 SQL Server 的最大容量规格,您可以在此处查看。 http://msdn.microsoft.com/en-us/library/ms143432(v=sql.120).aspx.

          如果您问“用于在 SQL 服务器中查询或插入数据的 .SQL 文件或变量的最大大小是否有限制?”我会说是的,每个变量都有一个限制。如果您想上传大尺寸的文件,我建议您将文件转换为 varbinary,或者您可以增加系统网站中的最大上传大小。 这里我举个例子http://msdn.microsoft.com/en-us/library/aa479405.aspx

          【讨论】:

            猜你喜欢
            • 2012-08-04
            • 1970-01-01
            • 2016-02-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-19
            • 1970-01-01
            相关资源
            最近更新 更多