2013-08-16 7 views
5

में डबल लूप कैसे करें, मैं एक अपॉइंटमेंट कैलेंडर एप्लिकेशन विकसित कर रहा हूं। अभी भी नौसिखिया यहाँ।एसक्यूएल सर्वर 2008

मुझे इस क्षेत्र में सहायता चाहिए।

मुझे कॉलम (`calendarID, स्लॉट, अपॉइंटमेंटडेट ') में डबल लूपिंग करने की आवश्यकता है।

'स्लॉट' कॉलम में बार-बार 28 तक 1,2,3,4,5,6,7,8 का मूल्य होगा जबकि कैलेंडर आईडी लगातार 868 मूल्य तक लूप होगा। नियुक्ति तिथि (वास्तव में मैं 1 पूरे साल के लिए यह करने के लिए योजना बना रहा हूँ)

अपेक्षित परिणाम

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 

यहाँ 1 Aug2013 से 31 अगस्त 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 

खेद द्वारा प्रदान की कोड का संपादन किया।

+1

दो प्रश्न: @x को 80 पर कैप्चर किया गया है और @y 16 पर कैप्चर किया गया है, जब आपका प्रश्न 100 और 8 कहता है? इसके अलावा, इसे वीबी.नेट के रूप में क्यों टैग किया जाता है? – Tim

+0

मैंने अभी देखा है कि मैं गलत तरीके से 8 की बजाय 16 में keyin, मैं पहले से ही संपादित किया है। असल में एप्लिकेशन फ्रंट एंड vb.net – cotz

+1

आपके प्रश्न के सामने के अंत में कुछ भी नहीं है - यह सब एसक्यूएल के बारे में है, इसलिए वीबी.नेट और कैलेंडर टैग की आवश्यकता नहीं है। – 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 

एक और दृष्टिकोण एक 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) 
+0

वाह आप बहुत अच्छे हैं! इस मंच के लिए दो अंगूठे ऊपर। मुझे सटीकता के साथ एक सुपर फास्ट जवाब की उम्मीद नहीं थी। आपका सुझाव कोड वास्तव में काम करता है, बहुत बहुत धन्यवाद! आस्तिक, अब जवाब के रूप में अपने उत्तर को कैसे चिह्नित करें। चेक मार्क डालने के लिए। – cotz

+0

मेरे पास एक और सवाल है, मुझे लगता है कि मेरी गलती है कि मुझे इसे अपने उपरोक्त पोस्ट के साथ एक साथ रखना चाहिए, आईडी जैसा कि ऊपर वर्णित दिनांक कॉलम पर कुछ मूल्य डालना है, मेरे पास एक और कॉलम दिनांक है। स्लॉट मान (1-8) एक महीने की तारीख तक लूप होना चाहिए (1-31। मैं उपरोक्त पोस्ट को निम्न क्षेत्र में संपादित करता हूं, यह जानने के लिए कि मेरा क्या मतलब है। बड़ी मदद के लिए धन्यवाद – cotz

+0

मैं आने का प्रबंधन करता हूं अपने स्वयं के समाधान के साथ हालांकि यह मैन्युअल चीज की तरह कुछ है। मैं वांछित दिनांक आधार को स्लॉट मान पर 1-28 रखने के लिए अद्यतन कमांड का उपयोग करता हूं। धन्यवाद आपके बहुमूल्य समय ^^, खुश कोडिंग के लिए बहुत सारे लोग। – 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

संबंधित मुद्दे