MS SQL Server 是否有generate_series 函数

Sah*_*sci 6 sql-server sql-server-2019

MS SQL Server 是否有像Postgresql那样的系列生成函数(又名generate_series)。如果没有,有没有基本的方法来实现该功能?优先考虑时间戳版本

我发现这个问题是一个老问题。也许新版本有更好的解决方案。

Mar*_*ith 15

从 SQL Server 2022 开始,您可以执行以下操作

\n
SELECT Value\nFROM GENERATE_SERIES( /* START= */ 1, /* STOP= */ 100, /* STEP= */ 1)\n
Run Code Online (Sandbox Code Playgroud)\n

在 SQL Bits 2022 上,据说它还将支持日期和数字,但这似乎并没有进入该函数的初始版本。但它仍然可以与 结合使用DATEADD来生成日期和日期时间。

\n

看起来效果很好。

\n

\xe2\x9c\x85数字生成的执行时间\n下面在我的测试虚拟机中在 700 毫秒内生成 10,000,000 个数字(分配给变量消除了将结果发送到客户端的任何开销)

\n
DECLARE @Value INT \n\nSELECT @Value =[value]\nFROM GENERATE_SERIES(1, 10000000)\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x9c\x85基数估计

\n

计算运算符将返回多少个数字很简单,SQL Server 利用了这一点,如下所示。

\n

在此输入图像描述

\n

\xe2\x9c\x85 没有不必要的万圣节保护

\n

在 CTP 2.0 及更早版本中,将此函数的结果插入表时的执行计划可能具有不必要的假脱机。现在这个问题似乎已经得到解决。

\n
CREATE TABLE dbo.Numbers(Number INT PRIMARY KEY);\n\nINSERT INTO dbo.Numbers\nSELECT [value]\nFROM GENERATE_SERIES(1, 10);\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

\xe2\x9c\x85 没有不必要的排序或区分

\n

CTP 2.0 及更早版本中,添加 anORDER BY [value]可以向计划添加排序,即使函数无论如何都按该顺序返回它们。现在这个问题似乎又得到了解决。

\n
SELECT DISTINCT [value]\nFROM GENERATE_SERIES(1, 10)\nORDER BY [value] \n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n


Han*_*non 9

在 T-SQL 中创建系列的一种相当常见的方法是使用 CTE 作为源,如下所示:

;WITH t AS
(
    SELECT n = v2.n * 10 + v1.n
    FROM (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v1(n)
    CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v2(n)
)
SELECT t.n
FROM t
ORDER BY T.n;
Run Code Online (Sandbox Code Playgroud)

上面的查询将返回从 0 到 99 的有序值列表。

对于日期,您可以这样实现:

;WITH t AS
(
    SELECT n = v2.n * 10 + v1.n
    FROM (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v1(n)
    CROSS JOIN (VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) v2(n)
)
SELECT DATEADD(DAY, t.n, '2019-01-01')
FROM t
ORDER BY T.n;
Run Code Online (Sandbox Code Playgroud)

其中提供了从 2019 年 1 月 1 日开始,持续 100 天,到 2019 年 4 月 10 日结束的日期列表。

还有许多其他方法可以生成这样的集合,包括生成“数字”表