2013-08-16 12 views
5

私は予定カレンダーアプリケーションを開発しています。まだここで初心者です。SQL Server 2008でdouble whileループを使用する方法

私はこの分野で助けが必要です。

私はカラム( `calendarID、Slot、AppointmentDate ')に二重ループを持つ必要があります。

'slot'列は、1,2,3,4,5,6,7,8の値を28まで繰り返し持ちますが、calendarIDは868の値に連続してループします。予定日は(実際に私は1全体の年のためにこれを行うことを計画しています)1 Aug2013から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 

は、私はそうしてみてください私のコードです私は私の希望する出力から非常に遠いです。 私が尋ねると、私のオリジナルのポストの編集のトラブルのために

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 

申し訳ありませんAstrand

によって提供されたコードを編集しました。

+1

2つの質問:@xは80でキャップされ、@yは16でキャップされているのはなぜですか?また、なぜVB.NETとしてタグ付けされていますか? – Tim

+0

私はちょうど私が間違って8の代わりに16をキーインしていることに気づいた、私はすでに編集した。 実際にアプリケーションのフロントエンドはvb.net – cotz

+1

あなたの質問はフロントエンドとは関係ありません.SQLに関するものなので、VB.NETとCalendarタグは必要ありません。 – Tim

答えて

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 
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 

別のアプローチは、

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 

ようIDENTITY COLUMN

何かを利用することだろう。しかし個人的にはSQL Iドンだので、私はよく

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) 
+0

あなたはとても良いです! このフォーラムには2つの親指があります。私は正確な超高速応答を期待していませんでした。あなたの提案コードは本当に動作します、ありがとう!あなたの答えを答えにする方法。チェックマークを付ける。 – cotz

+0

私は別の質問があります私は間違いだと思う私は私の上記の投稿と一緒にそれを置く必要があります、私はまた、日付欄 私は別の列の日付を持っているようにいくつかの値を入れたい。 Slot値(1-8)は月の日付にループする必要があります(1-31。 私は何かを知るために上記の投稿を編集します。 大きな助けをありがとうございます – cotz

+0

手作りのもののようなものだけど、自分のソリューションでアップ。 私はちょうど1-28であるスロットの値に目的の日付ベースを置くためにupdateコマンドを使用します。 あなたの貴重な時間に多くの人々に感謝^^、 ハッピーコーディング。 – cotz

2

のために行っているでしょうループをしなければならないと思います。あなたは簡単に再帰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

関連する問題