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

问题描述 投票:0回答:2

我正在编写一个冗长的查询系统,它利用 CTE 来构建有效的 SQL。即使是一个简单的系统,它也有可能创建多达一千个表达式,我担心将来可能会达到极限,不得不重新设计系统。

我到处寻找,但找不到答案。我想知道的是:
CTE 中允许的最大表达式数量是多少?

注意:我使用递归。

我最好的猜测是我受到每批允许的字符数的限制(请参阅SQL Server 查询的最大大小?IN 子句?是否有更好的方法

编辑

下面的测试代码。我的开发机器奇怪地停在 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);

我会考虑在生产服务器上进行测试,但这需要一段时间。

sql-server common-table-expression
2个回答
2
投票

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

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

但是,MSDN SQL Server 最大值列表或 CTE 文档中没有提及 CTE 的最大数量。

问题评论中提到的马丁的测试表明,对此没有具体的限制,因为他遇到了内存不足错误,而不是限制错误。我认为你的测试完全停在 600 一点也不奇怪,因为你使用的是

WHILE @i < 600
。尝试提高限制,看看会发生什么。


0
投票

我也遇到过类似的问题。在这里,我使用 Spark SQL(在 databricks 中),脚本在最终输出语句之前有 60 个 CTE。火花驱动器意外停止。我仍在想办法解决它。虽然必须提及,但我有一个资源限制,即 32GB、4 核单节点集群,这可能会成为阻碍。

© www.soinside.com 2019 - 2024. All rights reserved.