【问题标题】:how to have a double while loop in sql server 2008如何在 sql server 2008 中使用双 while 循环
【发布时间】:2013-08-18 10:45:21
【问题描述】:

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

我需要这方面的帮助。

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

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

【问题讨论】:

  • 两个问题:当您的问题是 100 和 8 时,为什么 @x 的上限为 80,@y 的上限为 16?另外,为什么这被标记为 VB.NET?
  • 我刚刚注意到我错误地键入了 16 而不是 8,我已经编辑过了。其实应用前端是vb.net
  • 你的问题与你的前端无关——都是关于 SQL 的,所以不需要 VB.NET 和 Calendar 标签。

标签: sql sql-server-2008 loops while-loop


【解决方案1】:

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

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)

【讨论】:

  • 哇,你太棒了!为这个论坛点赞两个。我没想到会有一个超快速的准确回复。您的建议代码确实有效,非常感谢! asstander,现在如何将您的答案标记为答案。打勾。
  • 我还有一个问题,我认为我的错误是我应该把它和我上面的帖子放在一起,我还想在上面提到的日期列上加上一些值,我还有另一个列日期。插槽值(1-8)应该循环到一个月的日期(1-31。我编辑了上面的帖子,在下部区域知道我的意思。感谢您的大力帮助
  • 我设法想出了自己的解决方案,尽管它类似于手动操作。我只是使用更新命令根据槽值 1-28 放置所需的日期。非常感谢您宝贵的时间^^,编码愉快。
【解决方案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 fiddle demo

【讨论】:

    【解决方案3】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2018-10-28
      • 2011-05-28
      • 2010-12-25
      • 2014-02-10
      • 2014-03-11
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 2015-12-30
      相关资源
      最近更新 更多