n大于76时运算结果就会出错,寻找解决办法

在SQL SERVER数据库执行80选7全组合 的脚本,设置 n大于76时运算结果就会出错,寻找解决办法

脚本如下( n不大于75时 运算结果正确可以进行下一步运算。初步分析问题出在脚本上,希望发帖后在专家的指导下解决这个问题)

;WITH T AS 
(
    SELECT TOP 80 rn=ROW_NUMBER()OVER(ORDER BY @@spid)
    FROM sysobjecTs 
)
SELECT * 
FROM T a
    JOIN T b ON a.rn<b.rn
    JOIN T c ON b.rn<c.rn
    JOIN T d ON c.rn<d.rn
    JOIN T e ON d.rn<e.rn
    JOIN T f ON e.rn<f.rn
    JOIN T g ON f.rn<g.rn

因为join超过了最大层数(默认为16层)造成的。
可以使用CROSS APPLY替代join

WITH T AS 
(
    SELECT TOP 80 rn=ROW_NUMBER()OVER(ORDER BY @@spid)
    FROM sysobjecTs 
)
SELECT * 
FROM T a
CROSS APPLY 
(
    SELECT * 
    FROM T b 
    WHERE b.rn > a.rn
) b 
CROSS APPLY
(
    SELECT *
    FROM T c
    WHERE c.rn > b.rn
) c
CROSS APPLY
(
    SELECT *
    FROM T d
    WHERE d.rn > c.rn
) d
CROSS APPLY
(
    SELECT *
    FROM T e
    WHERE e.rn > d.rn
) e 
CROSS APPLY
(
    SELECT *
    FROM T f
    WHERE f.rn > e.rn
) f
CROSS APPLY 
(
    SELECT *
    FROM T g
    WHERE g.rn > f.rn
) g

报错信息是什么?

我猜测,这个问题出现的原因是在SQL Server中,WITH T语句的结果集大小受到最大递归深度(MAXRECURSION)的限制,默认值为100。当WITH T语句中的结果集大小超过了MAXRECURSION的限制时,SQL Server会自动停止递归,导致结果集不完整,从而导致计算错误。

;WITH T AS
(
SELECT TOP 80 rn=ROW_NUMBER()OVER(ORDER BY @@spid)
FROM sysobjecTs
)
SELECT *
FROM T a
JOIN T b ON a.rn<b.rn
JOIN T c ON b.rn<c.rn
JOIN T d ON c.rn<d.rn
JOIN T e ON d.rn<e.rn
JOIN T f ON e.rn<f.rn
JOIN T g ON f.rn<g.rn
OPTION (MAXRECURSION 0);

bigint 数据类型存储是从 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807) 范围内的数字
80选7的全组合结果有 3176,716,400,超过了int 数据类型的存储范围,所以脚本修改了SQL Server 定义的ID数据类型的长度

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^