SqlCommand查询的长度有多少限制

时间:2008-12-03 00:01:52

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

SQL Server可以处理的查询长度是否有限制?

我有一个普通的SqlCommand对象,并将一个非常长的select语句作为字符串传递。

在针对SQL Server 2005/2008引擎运行时,查询似乎没问题但是不针对SQL Server 2000引擎执行。

我没有任何错误详细信息,因为我手边只有这些信息,但我的应用程序没有按预期工作。我可能会遇到安装SQL Server 2000实例的麻烦,但我只是想知道是否有人快速。是的,SQL Server 2000中有4K或8K限制,但2005年没有类型答案。

我知道我可以使用存储过程但是假设我有正当理由不使用它们: - )

6 个答案:

答案 0 :(得分:6)

对于特殊查询,SqlServer 2000具有4000个字符的查询限制。

你能把它抽象成一个存储过程吗?

答案 1 :(得分:6)

这是一个想法:

SQLServer 2000的VARCHAR最多允许8000个字符,因此可能有效:

伪代码:

SQLCommand command = new SqlCommand("exec sp_executeSQL @CMD");
command.Parameters.Add(new SqlParameter("@CMD",YourDynamicSQL, VARCHAR);

答案 2 :(得分:6)

必须阅读动态查询... The Curse and Blessings of Dynamic SQL,我强烈建议您阅读它。这次可能不会帮到你,但它在将来肯定对你有所帮助..

文章引用,以防万一。

  

SQL 2000中的sp_executesql和Long SQL字符串

     

SQL 2000和SQL 7上的sp_executesql存在限制,因为您不能使用长度超过4000个字符的SQL字符串。 (在SQL 2005及更高版本中,您应该使用nvarchar(MAX)来避免此问题。)如果要在查询字符串超出此限制时使用sp_executesql以使用参数化查询计划,则实际上有一种解决方法。也就是说,您可以在EXEC()中包装sp_executesql:

     

DECLARE @ sql1 nvarchar(4000),           @sql2 nvarchar(4000),           @state char(2)   SELECT @state ='CA'   SELECT @ sql1 = N'SELECT COUNT(*)'   SELECT @ sql2 = N'FROM dbo.authors WHERE state = @state'   EXEC('EXEC sp_executesql N'''+ @ sql1 + @ sql2 +''',                            N''@ state char(2)'',                            @state ='''+ @state +'''')

     

这样可行,因为sp_executesql的@stmt参数是ntext,因此它本身没有任何大小限制。

     

您甚至可以使用INSERT-EXEC来使用输出参数,如下例所示:

     

CREATE TABLE #result(cnt int NOT NULL)   DECLARE @ sql1 nvarchar(4000),           @sql2 nvarchar(4000),           @state char(2),           @mycnt int   SELECT @state ='CA'   SELECT @ sql1 = N'SELECT @cnt = COUNT(*)'   SELECT @ sql2 = N'FROM dbo.authors WHERE state = @state'   INSERT #result(cnt)      EXEC('DECLARE @cnt int            EXEC sp_executesql N'''+ @ sql1 + @sql2 +''',                               N''@ state char(2),                                  @cnt int OUTPUT'',                               @state ='''+ @state +''',                               @cnt = @cnt OUTPUT            选择@cnt')   SELECT @mycnt = cnt FROM #result

     

如果你认为这太麻烦而不值得,你就明白了。

答案 3 :(得分:2)

对于针对AS / 400运行的查询,我遇到了2k的限制。我通常通过删除所有空格来设法达到2k限制 - 它使查询不可读但是这是获得限制的最简单方法。

答案 4 :(得分:2)

根据我自己的经验,我发现,最初似乎是SQLServer2000对查询长度的限制,实际上(信不信由你)并不是对查询长度的限制,但是,是一个限制在查询中任何给定LINE的长度上 大约一年前,当我遇到这个问题时,我不知道行长是什么,但是你可以尝试将巨大的查询分成最大行长度为64K或以下的行,并且看看它怎么样。我的回忆是,线路长度限制可能是64K,信不信由你。我已经采取了这个疯狂的查询(由一个sql生成器程序生成),查询大约80K长,我在记事本中将它分成两半(即,我在SQL代码中放置了一个大约中间点的换行符---但我确保不要拆分任何单词),然后将整个内容粘贴到Query Analyzer命令窗口中。然后它工作,在中间的某处放置换行因此导致2行中的每一行小于64K长。我希望这有帮助。 如果没有,请尝试较小的线长。我确信当我的查询到达其中没有行,超过一定长度的点时,整个查询都有效。

答案 5 :(得分:-2)

不要因为sql注入而这样做。如果用户根本可以操纵应用程序的动态sql,请放弃此操作。

另外 - 考虑SP,因为它更容易维护,它也有助于sql注入。