允许的公用表表达式(CTE)表达式的数量是否有限制?

时间:2012-06-28 09:38:29

标签: sql-server common-table-expression

我正在编写一个冗长的查询系统,它利用CTE构建有效的SQL。有可能它甚至可以在一个简单的系统中创建多达一千个表达式,我担心未来我可能会达到极限,并且必须重新修改系统。

我搜索过高低,但我找不到答案。我想知道的是:
CTE中允许的最大表达式数是多少?

注意:我使用递归。

我最好的猜测是我受每批允许的字符数限制(参见Maximum size for a SQL Server Query? IN clause? Is there a Better Approach

修改

下面的测试代码。我的开发机器奇怪地停在600处。

DECLARE @i int = 1,  @q varchar(max);

SET @q = 'WITH[0]AS(SELECT 1 AS c)'

WHILE @i < 600
BEGIN
    SET @q = @q + ',[' + CONVERT(varchar, @i) + ']AS(SELECT * FROM[' + CONVERT(varchar, @i-1) + '])';
    SET @i = @i + 1;
END;

SET @q = @q + 'SELECT * FROM[' + CONVERT(varchar, @i-1) + ']';

EXEC (@q);

我会在生产服务器上看到这个测试,但这需要一段时间。

1 个答案:

答案 0 :(得分:1)

对于您可以在批处理中定义的非递归CTE的数量似乎没有直接上限。您应该仅受可用资源和任何其他适用限制的限制。

我花了一段时间研究,this是我能找到的问题的唯一直接答案。

但是,the MSDN list of SQL server maximums或CTE文件中没有提及最大数量的CTE。

问题的评论中提到的马丁的测试表明,由于他出现内存不足错误而不是限制错误,因此没有特定的限制。由于您正在使用WHILE @i < 600,因此我认为您的测试完全停在600时,我并不奇怪。尝试提高限额,看看会发生什么。