2013-08-16 11 views
5

Zajmuję się tworzeniem aplikacji kalendarza spotkań. Wciąż tu nowicjusz.Jak uzyskać podwójną pętlę w serwerze sql 2008

Potrzebuję pomocy w tej dziedzinie.

Potrzebuję podwójnej pętli w kolumnach (`calendarID, Slot, termin mianowania ').

Kolumna "szczeliny" będzie miała wartość 1,2,3,4,5,6,7,8 do 28 razy, podczas gdy identyfikator kalendarza będzie ciągle pętlą do wartości 868. Termin Powołanie będzie mieć wartość od 1 do 31 sierpnia Aug2013 2013 (faktycznie mam zamiar zrobić to na 1 cały rok)

oczekiwanego rezultatu

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 

Tu jest mój kod, który próbuję wydaje Jestem bardzo daleko od moich pożądanych wyników. I edycja kodu podanego przez 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 

przepraszam za kłopoty z prośbą i edytowania mój oryginalny post.

+1

Dwa pytania: dlaczego liczba osób jest ograniczona do 80, a liczba osób ograniczona do 16, kiedy pytanie brzmi 100 i 8? Dlaczego jest on oznaczony jako VB.NET? – Tim

+0

Właśnie zauważyłem, że nieprawidłowo keyin 16 zamiast 8, już edytowane. Rzeczywistym frontem aplikacji jest vb.net – cotz

+1

Twoje pytanie nie ma nic wspólnego z interfejsem użytkownika - chodzi tylko o SQL, więc tagi VB.NET i Calendar nie są potrzebne. – Tim

Odpowiedz

0

Oto odpowiedź na mój post, na wypadek gdyby w przyszłości ktoś taki jak ja będzie miał to samo pytanie.

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

OK, dostaniesz pożądany wynik, ale jest to wątpliwe. Po tym spróbuję trochę poprawić.

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 

Innym rozwiązaniem byłoby wykorzystanie IDENTITY COLUMN

Coś

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 

Ale osobiście bym poszedł do

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

Wow, jesteś taki dobry! dwie kciuki w górę na to forum. Nie spodziewałem się superszybkiej odpowiedzi z dokładnością. Twój kod sugestii naprawdę działa, Dziękuję bardzo! teraz, jak oznaczyć odpowiedź jako odpowiedź. umieścić znacznik wyboru. – cotz

+0

Mam inne pytanie myślę, że mój błąd, że powinienem umieścić go razem z moim powyższym postu, chciałbym również umieścić pewną wartość na kolumnie daty jak podano powyżej mam kolejną datę kolumny. Wartość gniazda (1-8) powinna być ustawiona na datę miesiąca (1-31. Edytuję powyższy wpis, w dolnej części, aby wiedzieć, co mam na myśli. dzięki za dużą pomoc – cotz

+0

Udaje mi się przyjść z moimi własnymi rozwiązaniami, chociaż jest to coś w rodzaju ręcznego. Po prostu używam polecenia update, aby ustawić żądane daty na podstawie wartości gniazda, która wynosi 1-28. Wielkie dzięki za twój cenny czas ^^, szczęśliwe kodowanie. – cotz

2

dobrze, ponieważ jest to SQL I don Myślę, że musisz zrobić pętlę. Można wygenerować te dane z rekurencyjnej CTE prościej:

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