添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
酷酷的电梯  ·  python ...·  1 年前    · 
悲伤的梨子  ·  QTreeWidget拖拽节点 - ...·  1 年前    · 

SQL服务器的.SQL文件或变量的最大尺寸?

11 人关注

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

当我说变量时,它意味着通过一些编程语言甚至ETL工具将一个变量传递给SQL服务器。

4 个评论
我以前曾用 sqlcmd ,用大的(~20MB)文件,从未出现过问题。使用SQL Studio管理工具也是如此。
@PaulDraper - 大约3周前,我用管理工作室使用了一个200Mb的文件,我得到一个奇怪的错误。但我的查询却没有问题。有什么方法可以找到限制吗?
好吧,看起来你正在这样做;)但说真的,我从来没有见过公布的限制。认识到这个答案将取决于所使用的外部工具或库。
@PaulDraper - 这里是那个从未得到解决的错误 - stackoverflow.com/questions/19647922/...
sql
sql-server
sql-server-2008
sql-server-2005
sql-server-2000
Steam
Steam
发布于 2013-11-17
9 个回答
DarkTygur
DarkTygur
发布于 2014-01-16
0 人赞同

你可以使用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之后的每个字符都被忽略了。这可以解释我的不正确语法错误。

Nick H.
Nick H.
发布于 2014-01-16
0 人赞同

是的,我以前见过这个。.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#编程和一个流读取器来读取这些大文件并执行它们。

向表中插入约50万次。只有长的插入语句,没有额外的逻辑,如选择、if-else等。那些大的插入文件都没有执行。
你是否从SQLCMD中运行它?运行成功了吗?如果你只是想看一下这个文件,用记事本打开它。如果它不能打开,那么文件就有问题了。用记事本打开时,顶部有什么奇怪的字符吗?
我不想使用SQLCMD,因为这个选项需要在服务器上改变很多设置。有什么其他方法吗?根本就没有什么奇怪的字符。
如果你只限于使用SSMS,那么你可以把sql文件分解成更小的sql文件。对不起,我也讨厌这个答案。如果你能使用C#工具,我会帮你写一个快速流读取器来执行脚本。
OzrenTkalcecKrznaric
OzrenTkalcecKrznaric
发布于 2014-01-16
0 人赞同

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

基本上,你所要做的就是。

  • 在你的 Query 菜单中选择 SQLCMD Mode
  • 查找你所调用的脚本(大型SQL文件)的路径
  • 打开一个 New Query (或使用现有的),在新的一行中写下这个代码

    :r D:\PathToMyLargeFile\MyLargeFile.sql

  • 运行该(调用)脚本

  • 如果你需要在你的被叫脚本中使用一个 变量 ,你必须在一个调用脚本中声明它。那么你的调用脚本就应该是这样的。

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

    假设你的被调用脚本将变量用于应该插入到行中的内容。那么它就应该是这样的...

    INSERT INTO MyTable (MyColumn)
    SELECT '$(myVariable)'
        
    JamieSee
    JamieSee
    发布于 2014-01-16
    0 人赞同

    Pranav在参考《 SQL Server最大容量规范 》一文时,算是走对了路;但是,适用于执行查询的限制是。

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

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

    此外,我还看到了在SQL Server Management Studio中执行大量SQL语句的问题。(相关问题请看 SQL Server不完成大批量SQL语句的执行 )。尝试在你的SQL中添加 SET NOCOUNT ON ,以防止发送不必要的数据。另外,当做大量的INSERT语句时,试着用 GO batch separator把它们分成若干批。

    谢谢。是否能保证GO能防止这个问题?如果是这样,为什么?
    是的,GO可以防止这个问题。GO不是一个SQL语句--它是给Management Studio或sqlcmd的一个命令,将GO命令之前的语句发送到SQL Server进行处理,等待结果,然后将下一组语句发送到下一个GO,以此类推,直到文件的最后。你不能把GO放在一个代码块里面(BEGIN/END)--每个块必须是一个有效的语句集。
    Xavier J
    Xavier J
    发布于 2014-01-16
    0 人赞同

    我认为你的担心来自于试图在SSMS中打开你的文件。 在SSMS中,打开一个20mb的文件可能会有问题--与在记事本或大多数文本编辑器中打开同样的文件没有什么区别。

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

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

    如果文件是SQL命令,你将需要一个能处理大文件的编辑器,如Vedit http://www.vedit.com/,它将无法执行SQL。 你必须在命令行中使用上面提到的sqlcmd来完成。

    JB9
    JB9
    发布于 2014-01-16
    0 人赞同

    这里有 几个链接 2 我希望它们可能对你有帮助

    这些链接将以何种方式帮助我?
    JB9
    我只是围绕这个主题做了一些研究,所以与你分享这个 infosys.com/microsoft/resource-center/Documents/..., 我不确定这是否会奏效,但请试一试。
    Pranav Singh
    Pranav Singh
    发布于 2014-01-16
    0 人赞同

    我在MSDN上看到了这篇文章,其中说明了" SQL服务器的最大容量规格 ",通过这个,我能够找到:

    对于 Sql Server 2012, 2008 R2, 2005 :

    最大文件大小(数据)。 16兆字节

    每个varchar(max), varbinary(max), xml, text, or 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的文件对我来说也失败了。也许我的数据包大小太小了?我怎样才能找到答案呢?
    数据包大小的设置可以在通过网络发送数据的webservices中进行操作。例如,在.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中使用独立的脚本。
    Manvendra Gupta
    Manvendra Gupta
    发布于 2014-01-16
    0 人赞同

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

    向SQL服务器插入大量数据的最快方法是使用批量复制功能(BCP BCP Utility )。

    如果你有SQL Server management studio,那么你也应该在C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Binn(或同等的)中查找bcp utlity。

    如果你想使用BCP工具,那么你将需要创建一个包含数据的文件,这可以是逗号分隔的。关于该文件应该是什么样子的,请参考bcp文档。

    rolandAkbar
    rolandAkbar
    发布于 2014-01-16
    0 人赞同