0

我得到了一个 sql 查询,它确实将数据存储在表上。它以数字开头。当我运行这个脚本时,有什么可能的方法吗?它不会从数字 1 开始。


失踪
1
2
3
4
5

这就是我想要的


失踪
12
13
14
15
16

SELECT IDENTITY(INT,@parameter, 1) Missing
      INTO dbo.tally
      FROM master.sys.all_columns c
      CROSS JOIN master.sys.all_columns c1
4

1 回答 1

2

如果您只想生成数字。你可以这样做:

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 < 16then 将永远继续生成数字。否则会引发最大递归错误。在第二部分中,我们还定义了我们希望将数字增加多少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。

参考:

于 2013-10-21T06:22:32.677 回答