SQL 使用递归递增日期

SQL increment date using recursion

我有一个 table,其中包含以下结构:

|-----------|------------|-----------|
| Number    | Date       | Subject   |
|-----------|------------|-----------|
| 1         | 2015-01-01 | ABC       |
| 2         | 2015-01-01 | ABC       |
| 3         | 2015-01-01 | ABC       |
| 4         | 2015-01-01 | ABC       |
|-----------|------------|-----------|

我需要遍历 table 并在每个日期增加 n 天。 所以,假设 n = 10 我应该得到这个结果:

|-----------|------------|-----------|
| Number    | Date       | Subject   |
|-----------|------------|-----------|
| 1         | 2015-01-01 | ABC       |
| 2         | 2015-01-11 | ABC       |
| 3         | 2015-01-21 | ABC       |
| 4         | 2015-01-31 | ABC       |
|-----------|------------|-----------|

问题有点复杂,因为 n 是通过使用需要 previous generated date 的函数生成的 我正在尝试使用 CTE 通过以下 CTE 来完成此操作,但我得到的行数比预期的要多。

WITH myCte(Number, Date, Subject)
AS
(
   SELECT * FROM MyTable
   UNION ALL
   SELECT
      Number, dbo.get_next_date(Date)
   FROM MyCte
)
SELECT * FROM MyCte

那是因为递归 CTE 中没有 WHERE 子句。这将导致查询在达到 MAXRECURSION 值(默认 100)时停止。

这是一个使用 WHERE 子句设置限制的示例

DECLARE @MyTable TABLE
(
Number  int,
Dt      Date,
Sub   CHAR(3)
)

INSERT INTO @MyTable
VALUES
(1,'2015-01-01','ABC'),
(2,'2015-01-11','ABC'),
(3,'2015-01-21','ABC'),
(4,'2015-01-31','ABC') 



;WITH myCte(Number, Date, Subject)
AS
(
   SELECT * FROM @MyTable
   UNION ALL
   SELECT
      Number, DATEADD(day, 10, Date),Subject
   FROM MyCte
   WHERE Date < GETDATE()
)
SELECT * FROM MyCte

编辑 - 如果您知道行数,那么您可以使用 TOP 并获取这些行。

SELECT TOP 4 * FROM MyCte