簡體   English   中英

如何在SQL Server 2008中進行兩次while循環

[英]how to have a double while loop in sql server 2008

我正在開發約會日歷應用程序。 這里還是新手。

我需要這方面的幫助。

我需要在列(“ calendarID,Slot,AppointmentDate”)中進行兩次循環。

“ slot”列的值將重復1、2、3、4、5、6、7、8最多重復達到28,而calendarID將連續循環到868值。 約會日期的值是從2013年8月1日到2013年8月31日(實際上我打算整整一年)

預期結果

calendarID | Slot       |  AppointmentDate      
----------------------------------------------  
    1          | 1         | 1 Aug 2013  
    2          | 2         | 1 Aug 2013    
    3          | 3         | 1 Aug 2013   
    4          | 4         | 1 Aug 2013   
    5          | 5         | 1 Aug 2013   
    6          | 6         | 1 Aug 2013    
    7          | 7         | 1 Aug 2013   
    8          |..until 28 | 1 Aug 2013 
    9          | 1         | 2 Aug 2013    
    10         | 2         | 2 Aug 2013
    11         | 3         | 2 Aug 2013  
    ...until   
    868        | n         | n Month 2013  

這是我嘗試的代碼,似乎與所需的輸出距離很遠。 我編輯了Astrand提供的代碼

DECLARE @tblCalendar TABLE(CalendarEntryID INT,
    Slot INT,  ADate Varchar(50))

DECLARE @x int, @y int , @d INT

SET @X = 1 SET @y = 1 SET @d = 1

WHILE @X <= 868
BEGIN 

    WHILE  @Y <=28 AND @d <=31 AND @X <= 868 --LOOP FOR SLOT COLUMN
        BEGIN

        INSERT INTO @tblCalendar (CalendarEntryID,Slot, ADate)
        Values (@x, @y,@d +'/Aug/2013')
                SET @y = @y + 1
                SET @x = @x + 1
        SET @d = @d + 1 
           END
    SET @y = 1  
END

SELECT  *
FROM    @tblCalendar

很抱歉詢問和編輯我的原始帖子。

好的,這將為您提供所需的結果,但這是有問題的。 之后,我會嘗試並對其進行改進。

DECLARE @tblCalendar TABLE(
        CalendarEntryID INT,
        Slot INT
)

DECLARE
@x int, @y int

SET @X = 1 SET @y = 1

WHILE @X <= 100
BEGIN 

    WHILE @Y <=8 AND @X <= 100--LOOP FOR SLOT COLUMN
            BEGIN
            INSERT INTO @tblCalendar (CalendarEntryID,Slot)
            Values (@x, @y)

                SET @y = @y + 1
                SET @x = @x + 1
            end

    SET @y = 1
END


SELECT  *
FROM    @tblCalendar

另一種方法是利用IDENTITY COLUMN

就像是

DECLARE @tblCalendar TABLE(
        CalendarEntryID INT IDENTITY(1,1),
        Slot INT
)

DECLARE
@x int, @y int

SET @X = 1 SET @y = 1

WHILE @X <= 100
BEGIN 

    WHILE @Y <=8 AND @X <= 100--LOOP FOR SLOT COLUMN
            BEGIN
            INSERT INTO @tblCalendar (Slot)
            Values (@y)

                SET @y = @y + 1
                SET @x = @x + 1
            end

    SET @y = 1
END


SELECT  *
FROM    @tblCalendar

但是我個人會去

DECLARE @Max INT = 100,
        @MaxGroup INT = 8

    ;WITH Val AS (
            SELECT  1 CalendarEntryID
            UNION ALL
            SELECT  CalendarEntryID + 1
            FROM    Val
            WHERE   CalendarEntryID + 1 <= @Max
    )
    SELECT  CalendarEntryID,
            ((CalendarEntryID - 1) % @MaxGroup) + 1 Slot
    FROM    Val
    OPTION (MAXRECURSION 0)

好吧,因為它是SQL,所以我認為您不必循環。 您可以使用遞歸CTE輕松生成此數據:

with cte as (
    select 1 as calendarID
    union all
    select calendarID + 1
    from cte1
    where calendarID < 100
)
select
    CalendarID, (CalendarID - 1) % 8 + 1
from cte
order by CalendarID

sql小提琴演示

這是我的帖子的答案,以防萬一將來像我這樣的人會有同樣的問題。

DECLARE
@x int, @y int, @d date, @i date, @status Nvarchar(50)
SET @X = 1 
SET @y = 1
SET @d = DATEADD (dd, 1 , '31/Jul/2013') -- '2013/07/01' --default date to August
SET @status = 'Available'

WHILE @X <= 868

BEGIN 

WHILE @Y <=28 AND @X <= 868--LOOP FOR SLOT COLUMN
        BEGIN
            INSERT INTO  tblCalendar (CalendarEntryID,Slot,Date,Status)
            Values (@x, @y,@d,@status)
            SET @x = @x + 1
            SET @y = @y + 1
            SET @i = @d
        END
SET @d = DATEADD (dd, 1 , @i) -- THIS WILL INCREMENT THE DATE ACCORDING TO SLOT
SET @y = 1  
END
SELECT  *
FROM    tblCalendar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM