可以使用自引用 CTE 和 union all 在 SQL Server 中模拟循环,如下所示:
declare @a int = 1;
declare @b int = 5;
;with Tbl as (
select @a a
UNION ALL
select (a + 1) a
from Tbl
where (a + 1) < @b
)
select * from Tbl
当您想要创建从开始日期到结束日期的日期列表然后在这些特定日期加入时,这很有用。
我也可以想象也想对列这样做。有没有一种方法可以在不使用动态 SQL 的情况下在 SQL Server 中实现这一点?我可能希望将这样的查询保存为视图,而不是 SP(尽管我知道这可以通过动态 SQL 来实现)
您正在谈论在 CTE 中使用 UNION 来生成日期。在这里,我展示了如何在列中生成日期。
您可以使用PIVOT 子句。但是,有一个限制:必须事先知道列名。例如,如果你想显示每月的数据,你可以使用天数作为列名:
结果看起来像这样(我在 11 天时截取了图像,但实际上,最多有 31 列):
如果必须显示更多日期,则可以使用自开始日期以来的天数作为列名。如果您基于此查询创建报告(使用某些报告工具),您可以将此数字添加到开始日期以再次获取列标题的真实日期。
由于您必须明确指定列名,因此这部分不需要 CTE,但您可以将数据透视查询与 CTE 结合起来生成行。
社区维基回答:
这将很快达到 CTE 的递归限制,默认情况下通常为 100。尽管可以使用
MAXRECURSION
查询提示来扩展限制,但会影响性能。研究Tally Table和Numbers Table以获得更好、更有效的方法来做到这一点。这是一个关于计数/数字表的链接,这是一个关于创建日历表的链接。