【发布时间】:2014-07-22 20:28:09
【问题描述】:
我觉得这是一个常见问题,但似乎我在 SO 或其他网站上找到的答案似乎都没有解决带有计数器的 while 循环问题。
假设我正在尝试用 SQL 编写一个存储过程,该过程将通过在当月剩余时间的每一天插入一行来填充用户的时间表。如果 @endMonth 变量包含该月的最后一天,那么我知道我可以轻松编写一个 while 循环并按照以下方式执行一些操作:
WHILE @date <= @endMonth
BEGIN
//Do some action with the date, like an insert
SET @date = DATEADD(d, 1, @date) //increment the date by one day
END
但是,查看 here 和其他网站上的答案让我相信,如果可能的话,最好避免使用 while 循环。
所以我的问题是:有没有一种方法可以在不使用WHILE 结构的情况下在SQL 中实现带有计数器的循环?我将使用什么技术来转换类似于我发布的循环?或者像这样的东西,我是否必须硬着头皮只使用一个while循环?
顺便说一句,以下一些问题很接近,但似乎都没有完全解决需要计数器作为循环条件的问题。大多数答案似乎都谴责使用WHILE 循环,但我似乎无法找到通用解决方案作为替代方案。
sql while loop with date counter
SQL Server 2008 Insert with WHILE LOOP(这个很接近,但不幸的是对我来说它只适用于自动增量列)
【问题讨论】:
-
在那种情况下,如果缺少的代码是为每一天插入一条记录,那么您可以通过加入发现缺少日期的 CTE 来做到这一点。摆脱 while 循环的一般情况,值得注意的是我应该认为的例外情况......顺便说一下,这里有大量 CTE 示例来生成一系列日期,通常用于计算工作日等。
-
这是我一直以来的疑问。当我无法在 SQL 中绕过它时,我个人仍然使用 while 循环,即使我被告知不要这样做。没有人提供过它不好的具体原因。
-
这很糟糕,因为它需要更长的时间并且使用更多的资源。 SQL 是一种基于集合的语言。
标签: sql sql-server loops while-loop