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



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

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

注意:我没有使用递归。

最好的猜测是我受到每批允许的字符数的限制(请参阅 SQL Server 查询的最大大小?在条款中?有没有更好的方法)

编辑

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

我将了解如何在生产服务器上对此进行测试,但这需要一段时间。

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

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

但是,MSDN 的 SQL 服务器最大值列表或 CTE 文档中没有提到最大数量的 CTE。

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

最新更新