8

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

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

在针对 SQL Server 2005/2008 引擎运行时,查询似乎很好,但在 SQL Server 2000 引擎上不执行。

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

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

4

6 回答 6

7

这是一个想法:

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

伪代码:

SQLCommand command = new SqlCommand("exec sp_executeSQL @CMD");
command.Parameters.Add(new SqlParameter("@CMD",YourDynamicSQL, VARCHAR);
于 2008-12-03T00:29:33.830 回答
6

SqlServer 2000 对即席查询有 4000 个字符的查询限制。

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

于 2008-12-03T00:05:49.493 回答
6

动态查询必读...动态 SQL 的诅咒和祝福,我强烈推荐你阅读它。这次可能对你没有帮助,但它肯定会在未来帮助你..

从文章中引用,以防万一。

SQL 2000 中的 sp_executesql 和长 SQL 字符串

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

声明 @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 SELECT @cnt') SELECT @mycnt = cnt来自#结果

如果您认为这太混乱而不值得,您可以理解我的理解。

于 2008-12-03T00:52:43.160 回答
2

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

于 2008-12-03T01:24:29.990 回答
2

根据我自己的经验,我发现,最初似乎是 SQLServer2000 对查询长度的限制,实际上(信不信由你)并不是对查询长度的真正限制,而是对长度的限制查询中任何给定的 LINE。
大约一年前我遇到了这个问题,所以我不记得行长是多少,但是您可以尝试将巨大的查询拆分为最大行长为 64K 左右的行,并且看看情况如何。我的回忆是,行长限制可能是 64K,信不信由你。我采用了这个非常长的查询(由 sql-generator 程序生成),查询长约 80K,我在记事本中将其分成两半(即,我在 SQL 代码中的大约一半处添加了换行符--- 但我确保不要拆分任何单词),然后将整个内容粘贴到查询分析器命令窗口中。然后它起作用了,在中间的某个地方换行,从而导致两行中的每一行的长度都小于 64K。我希望这有帮助。如果没有,请尝试更小的线长。

于 2008-12-16T20:03:28.027 回答
-2

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

还 - 考虑 SP,因为它更易于维护,并且还有助于 sql 注入。

于 2008-12-03T00:39:26.557 回答