SQL Server 在需要计数器时避免SQL中的while循环

r7xajy2e  于 2022-11-28  发布在  其他
关注(0)|答案(3)|浏览(233)

我觉得这是一个常见的问题,但似乎没有一个答案,我发现在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(这个很接近,但不幸的是,对我来说,它只适用于自动增量列)

dxxyhpgq

dxxyhpgq1#

我看到了很多填充数据的例子。
首先你在cte中创建从开始到结束的日期,然后你可以将它插入到表中。
其中之一是与cte:

DECLARE @StartDate DateTime = '2014-06-01'
DECLARE @EndDate DateTime = '2014-06-29'


;WITH populateDates (dates) AS (

    SELECT @StartDate as dates
    UNION ALL
    SELECT DATEADD(d, 1, dates)
    FROM populateDates
    WHERE DATEADD(d, 1, dates)<=@EndDate

)
SELECT *
INTO dbo.SomeTable
FROM populateDates

你应该试着在互联网上寻找how to populate date in sql table

a6b3iqyw

a6b3iqyw2#

一般情况下,可以在不使用游标得情况下递增值,方法是在同一个select语句中赋值并递增变量,如下所示:

DECLARE @i INT = 0

DECLARE @table TABLE
    (
      ID INT ,
      testfield VARCHAR(5)
    )

INSERT  INTO @table
        ( testfield )
VALUES  ( 'abcd'),
        ( 'efgh' ),
        ( 'ijkl' ),
        ( 'mnop' )

UPDATE  @table
SET     @I = ID = @i + 1

SELECT  *
FROM    @table
w41d8nur

w41d8nur3#

我用了一个序列--临时创建。
我需要在脚本上下文之外进行更新,使用普通SQL,sequence是我能想到的唯一“计数器”。

相关问题