[英]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
這是我的帖子的答案,以防萬一將來像我這樣的人會有同樣的問題。
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.