SQL Server可以处理的查询长度是否有限制?
我有一个普通的SqlCommand对象,并将一个非常长的select语句作为字符串传递。
在针对SQL Server 2005/2008引擎运行时,查询似乎没问题但是不针对SQL Server 2000引擎执行。
我没有任何错误详细信息,因为我手边只有这些信息,但我的应用程序没有按预期工作。我可能会遇到安装SQL Server 2000实例的麻烦,但我只是想知道是否有人快速。是的,SQL Server 2000中有4K或8K限制,但2005年没有类型答案。
我知道我可以使用存储过程但是假设我有正当理由不使用它们: - )
答案 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注入。