在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数据类型的长度
--查询外键
SELECT * FROM sys.foreign_keys
WHERE referenced_object_id=OBJECT_ID('被引用的表名');
--删除外键 删除掉引用表的外键
ALTER TABLE dbo.引用的表名 DROP constraint 查询到的外键名;
根据提供的信息,无法得出解决问题的具体方案。需要更详细的错误信息或报错截图来帮助分析问题根源。同时,需要进一步了解n在脚本中的具体含义,以便寻找解决办法。建议补充完整信息后再进行进一步的分析和解决。