Sahap Asci Asked: 2019-12-10 01:52:12 +0800 CST2019-12-10 01:52:12 +0800 CST 2019-12-10 01:52:12 +0800 CST MS SQL Server 是否有 generate_series 功能 772 MS SQL Server 是否具有像Postgresql那样的系列生成函数(又名 generate_series)。如果没有,是否有实现该功能的基本方法?时间戳版本是首选 我发现这个问题很老了。也许在新版本中有更好的解决方案。 sql-server sql-server-2019 3 个回答 Voted Martin Smith 2022-03-11T07:52:07+08:002022-03-11T07:52:07+08:00 从 SQL Server 2022开始,您将能够做到 SELECT Value FROM GENERATE_SERIES(START = 1, STOP = 100, STEP=1) SQL Bits 表示它还将支持日期和数字。 在 SQL Server 2022 (CTP2.0) 的公共预览版中,有一些非常有前途的元素,而另一些则不太乐观。希望在实际发布之前可以解决负面问题。 ✅数字生成的执行时间 下面在我的测试 VM 中在 700 毫秒内生成 10,000,000 个数字(分配给变量消除了向客户端发送结果的任何开销) DECLARE @Value INT SELECT @Value =[value] FROM GENERATE_SERIES(START=1, STOP=10000000) ✅基数估计 计算运算符将返回多少个数字很简单,SQL Server 就利用了这一点,如下所示。 ❌ 不必要的万圣节保护 下面的插入计划有一个完全不必要的假脱机 - 大概是因为 SQL Server 当前没有逻辑来确定行的源不是潜在的目标。 CREATE TABLE dbo.NumberHeap(Number INT); INSERT INTO dbo.Numbers SELECT [value] FROM GENERATE_SERIES(START=1, STOP=10); 当插入在 Number 上具有聚集索引的表中时,线轴可能会被替换为排序(这也提供了相分离) ❌ 不必要的排序 下面将按顺序返回行,但 SQL Server 显然还没有设置属性来保证这一点并在执行计划中利用它。 SELECT [value] FROM GENERATE_SERIES(START=1, STOP=10) ORDER BY [value] Aaron Bertrand 指出,最后两点都在雷达上待修复。 Best Answer Hannah Vernon 2019-12-10T13:07:57+08:002019-12-10T13:07:57+08:00 在 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; 上面的查询将返回从 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; 其中提供了从 2019 年 1 月 1 日开始、持续 100 天、到 2019 年 4 月 10 日结束的日期列表。 还有许多其他方法可以生成这样的集合,包括生成“数字”表。 Peter Vandivier 2019-12-10T02:16:17+08:002019-12-10T02:16:17+08:00 是,自 SQL Server 2022 起 在此之前, SQL Server 反馈论坛上的跟踪可在这篇文章和这篇文章中找到。
从 SQL Server 2022开始,您将能够做到
SQL Bits 表示它还将支持日期和数字。
在 SQL Server 2022 (CTP2.0) 的公共预览版中,有一些非常有前途的元素,而另一些则不太乐观。希望在实际发布之前可以解决负面问题。
✅数字生成的执行时间 下面在我的测试 VM 中在 700 毫秒内生成 10,000,000 个数字(分配给变量消除了向客户端发送结果的任何开销)
✅基数估计
计算运算符将返回多少个数字很简单,SQL Server 就利用了这一点,如下所示。
❌ 不必要的万圣节保护
下面的插入计划有一个完全不必要的假脱机 - 大概是因为 SQL Server 当前没有逻辑来确定行的源不是潜在的目标。
当插入在 Number 上具有聚集索引的表中时,线轴可能会被替换为排序(这也提供了相分离)
❌ 不必要的排序
下面将按顺序返回行,但 SQL Server 显然还没有设置属性来保证这一点并在执行计划中利用它。
Aaron Bertrand 指出,最后两点都在雷达上待修复。
在 T-SQL 中创建系列的一种相当常见的方法包括使用 CTE 作为源,例如:
上面的查询将返回从 0 到 99 的有序值列表。
对于日期,您可以像这样实现它:
其中提供了从 2019 年 1 月 1 日开始、持续 100 天、到 2019 年 4 月 10 日结束的日期列表。
还有许多其他方法可以生成这样的集合,包括生成“数字”表。
是,自 SQL Server 2022 起
在此之前, SQL Server 反馈论坛上的跟踪可在这篇文章和这篇文章中找到。