如果您只想生成数字。你可以这样做:
WITH Nbrs ( n ) AS (
SELECT 12 UNION ALL
SELECT 1 + n FROM Nbrs WHERE n < 16 )
SELECT
n AS MISSING
FROM
Nbrs
更新
有很多方法可以做一个计数表。最常见的情况是它使用循环来生成数字
此示例显示使用递归 CTE 生成的计数表。第一部分:
SELECT 12 UNION ALL
定义是否要启动计数表。第二部分:
SELECT 1 + n FROM Nbrs WHERE n < 16 )
定义是结束计数表。如果您删除WHERE n < 16
then 将永远继续生成数字。否则会引发最大递归错误。在第二部分中,我们还定义了我们希望将数字增加多少SELECT 1 + n
。如果您将其更改为SELECT 2 + n
. 然后输出将如下所示:
MISSING
12
14
16
现在因为我们增加了计数表SELECT 1 + n
并在 16 处停止。输出将是:
MISSING
12
13
14
15
16
更新 2
如果你想要更多的数字,那么 300k。然后你可以设置:
OPTION ( MAXRECURSION 0 )
在查询按钮中。所以例如这个:
WITH Nbrs ( n ) AS (
SELECT 12 UNION ALL
SELECT 1 + n FROM Nbrs WHERE n < 1000000000 )
SELECT
n AS MISSING
FROM
Nbrs
OPTION ( MAXRECURSION 0 )
将产生超过 300k。我认为引入了此错误,因此您不能拥有永无止境的递归 ctes。
参考: