6

我正在开发约会日历应用程序。这里还是新手。

我需要这方面的帮助。

我需要在列中进行双重循环(`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

很抱歉询问和编辑我的原始帖子的麻烦。

4

3 回答 3

3

好的,这将为您提供所需的结果,但这是值得怀疑的。之后我会尝试改进它。

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)
于 2013-08-16T05:28:15.680 回答
2

好吧,因为它是 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 小提琴演示

于 2013-08-16T05:31:44.927 回答
0

这是我帖子的答案,以防将来像我这样的人会遇到同样的问题。

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
于 2013-08-19T16:23:44.790 回答