SQL सर्वर में for-loop का सिंटैक्स


238

forTSQL में एक पाश का वाक्यविन्यास क्या है ?


10
SQL उस भाषा की तुलना में बहुत भिन्न भाषा है जिसका आप उपयोग करते हैं। यह किस पर केंद्रित है , कैसे नहीं । आप SQL सर्वर को बताते हैं कि आपको क्या परिणाम चाहिए, और यह पता लगाने दें कि उत्तर का उत्पादन कैसे करें। या, जो मैंने अभी-अभी कहा है उसे वापस लाने के लिए - एसक्यूएल में लूप के लिए नहीं है।
डेमियन__उन्नीवर २०'११ को _:५_

5
WHILE @I < 10; SET @I = @I + 1; BEGIN; ...; END? हालांकि, इसका उपयोग अधिकांश क्वेरी प्रसंस्करण के लिए नहीं किया जाना चाहिए (लेकिन कभी-कभी आवश्यक हेरफेर के लिए आवश्यक है)। इस तरह के कई निर्देश / संकेत गूगल पर "लूप के लिए tsql" का उपयोग करके उपलब्ध हैं।

7
JOINs के पक्ष में छोरों से बचें और संचालन सेट करें।
Oded

2
यदि आप SQL में विशेषज्ञ नहीं हैं, तो आपको लूप का उपयोग करने पर विचार नहीं करना चाहिए। कुछ ही स्थितियाँ हैं जहाँ किसी को ज़रूरत होती है और बाकी के समय में, लूप का उपयोग करना आपकी कार को चलाने के बजाय धक्का देने के बराबर है। रिकॉर्ड के माध्यम से लूप करने के बजाय डेटा सेट के बारे में सोचना सीखें। लूपिंग एक विशेषज्ञ स्तर का कार्य है क्योंकि वाक्य रचना कठिन नहीं है, लेकिन क्योंकि आपको यह जानने की आवश्यकता है कि इससे पहले कि आपको इसका उपयोग करने की अनुमति दी जाए, तो आपको इससे कितना नुकसान हो सकता है।
HLGEM

2
कभी-कभी इसका उपयोग परीक्षण डेटा को एक परीक्षण डेटाबेस में जल्दी से प्राप्त करने के लिए किया जा सकता है जिसे आप अभी भी जल्द ही हटाने जा रहे हैं। उस स्थिति में, इसका उपयोग करने से C # जैसे कुछ और में लिखे गए एक अलग कार्यक्रम से गुजरने की आवश्यकता दूर हो जाती है, और इंजीनियरिंग विशेष रूप से एक बड़ी चिंता का विषय नहीं है। फिर से, मैं इसे परीक्षण डेटा के संदर्भ में कह रहा हूं।
Panzercrisis

जवाबों:


210

T-SQL में FORलूप नहीं होता है , इसमें एक WHILEलूप होता है
WHILE (Transact-SQL)

WHILE Boolean_expression
BEGIN

END

8
जॉइन (और सेट ऑपरेशंस) को एसक्यूएल में लूपिंग कंस्ट्रक्शन पर प्राथमिकता दी जानी चाहिए।
Oded

6
स्ट्रेसिंग पर कोई सीमा नहीं है (विशेषकर उन लोगों के लिए जो एसक्यूएल के लिए नए हैं), डेमियन ने क्या कहा: "एसक्यूएल एक बहुत ही अलग भाषा है जिसकी तुलना आप कर रहे हैं। यह इस बात पर केंद्रित है कि क्या, कैसे नहीं। आप एसक्यूएल सर्वर को बताते हैं। परिणाम आप चाहते हैं, और यह पता लगाने के लिए कि उत्तर का उत्पादन कैसे किया जाए। "
ypercube,

1
यह ध्यान रखना दिलचस्प है कि MS प्रलेखन यहाँ गलत है, वास्तव में। WHILE एक बूलियन अभिव्यक्ति नहीं लेता है - यह एक विधेय लेता है - जो TRUE या FALSE का मूल्यांकन करने में सक्षम होने के अलावा, UNKNOWN भी हो सकता है।
Damien_The_Unbeliever

360

केवल लूप के लिए कोई लूप नहीं है:

DECLARE @i int = 0

WHILE @i < 20
BEGIN
    SET @i = @i + 1
    /* do some work */
END

20
यह ध्यान रखें कि यदि आप लूप में इंडेक्स का उपयोग करने का इरादा रखते हैं तो आप अपने उपयोग के मामले के आधार पर पहले की बजाय अंतिम चीज़ को बढ़ाना चाहते हैं।
jinglesthula

3
यह भी ध्यान दें कि स्थानीय चर के लिए डिफ़ॉल्ट मान सादे SQL में समर्थित नहीं है। इसलिए आपको SET @i = 0लूप के लिए पहले अलग होना चाहिए ।
नक्स

1
@ नक्स: 0 स्पष्ट रूप से घोषणा के दौरान सेट किया गया है
TcKs

7
हां, लेकिन यह पुराने SQL सर्वर पर काम नहीं करता है (कम से कम 2005 में नहीं)।
Nux

इसके अलावा, यह ध्यान दिया जाना चाहिए कि आमतौर पर पूर्णांक बढ़ने के पहले काम किया जाता है। SQL में बहुत सारे लूप्स वास्तव में उस पूर्णांक का उपयोग अपने काम में करते हैं (पंक्ति से पंक्ति में या अस्थायी तालिकाओं में परिणाम के लिए पुनरावृत्ति) और अंत के बजाय चक्र की शुरुआत में वृद्धि होने पर इसे फेंक दिया जा सकता है।
CSS

34

अधिक जानकारी

बस के रूप में जोड़ने के लिए कोई भी एक जवाब पोस्ट किया है जिसमें शामिल है कि कैसे वास्तव में पुनरावृत्ति करना हालांकि एक लूप के अंदर डेटासेट, आप OFFSET FETCH के कीवर्ड का उपयोग कर सकते हैं ।

प्रयोग

DECLARE @i INT = 0;
SELECT @count=  Count(*) FROM {TABLE}

WHILE @i <= @count
BEGIN

    SELECT * FROM {TABLE}
    ORDER BY {COLUMN}
    OFFSET @i ROWS   
    FETCH NEXT 1 ROWS ONLY  

    SET @i = @i + 1;

END

2
एक कर्सर का उपयोग करने के लिए अच्छा विकल्प।
डांटे.स्मिथ

28

DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=5) 
BEGIN
    PRINT @intFlag
    SET @intFlag = @intFlag + 1
END
GO

13
ढेर अतिप्रवाह में आपका स्वागत है! क्या आप यह बताने के लिए कुछ आख्यान जोड़ने पर विचार करेंगे कि यह कोड क्यों काम करता है, और यह सवाल का जवाब क्या देता है? यह सवाल पूछने वाले व्यक्ति और किसी अन्य व्यक्ति के लिए बहुत मददगार होगा।
एंड्रयू बार्बर

18
यह आत्म-व्याख्यात्मक है।
एडवर्ड ओलिमिसन

4
यह आत्म व्याख्यात्मक कैसे नहीं है? मेरे पास एक ही सवाल था, मैं तुरंत जवाब समझ गया।
डांटे.स्मिथ

1
नामकरण सम्मेलन को छोड़कर यह उत्तर @TcKs से कैसे भिन्न है?
सुशील जाधव

7

इस बारे में कैसा है:

BEGIN
   Do Something
END
GO 10

... निश्चित रूप से आप एक वृद्धिशील काउंटर इसके अंदर रख सकते हैं यदि आपको गिनती करने की आवश्यकता है।


3
'10 जाओ'? SQL Server 2008 इसे पसंद नहीं करता है।
संसाधन

7

लूप के लिए SQL सर्वर द्वारा अभी तक आधिकारिक रूप से समर्थित नहीं है। पहले से ही वहाँ है इस सवाल का जवाब प्राप्त करने पर के लिए लूप के अलग अलग तरीकों से। मैं SQL सर्वर में विभिन्न प्रकार के लूप प्राप्त करने के तरीकों पर उत्तर का विवरण दे रहा हूं।

पाश के लिए

DECLARE @cnt INT = 0;

WHILE @cnt < 10
BEGIN
   PRINT 'Inside FOR LOOP';
   SET @cnt = @cnt + 1;
END;

PRINT 'Done FOR LOOP';

यदि आप जानते हैं, तो आपको लूप के पहले पुनरावृत्ति को पूरा करने की आवश्यकता है, फिर आप SQL सर्वर का DO..WHILE या REPEAT..UNTIL संस्करण आज़मा सकते हैं ।

DO.Hile लूप

DECLARE @X INT=1;

WAY:  --> Here the  DO statement

  PRINT @X;

  SET @X += 1;

IF @X<=10 GOTO WAY;

REPEAT..UNTIL लूप

DECLARE @X INT = 1;

WAY:  -- Here the REPEAT statement

  PRINT @X;

  SET @X += 1;

IFNOT(@X > 10) GOTO WAY;

संदर्भ


ऐसा प्रतीत होता है कि यहां कॉपी-पेस्ट-
पुन

@SecretAgentMan: दोनों जवाब अलग-अलग सवालों के जवाब दे रहे हैं। दोनों जवाबों में दिया गया अतिरिक्त डेटा।
सोमनाथ मुलुक

6

सरल उत्तर है NO !!

FORएसक्यूएल में कोई नहीं है, लेकिन आप जिस तरह से काम करेंगे उसे प्राप्त करने के लिए उपयोग WHILEया GOTOप्राप्त कर सकते हैं FOR

जबकि :

DECLARE @a INT = 10

WHILE @a <= 20
BEGIN
    PRINT @a
    SET @a = @a + 1
END

के लिए जाओ :

DECLARE @a INT = 10
a:
PRINT @a
SET @a = @a + 1
IF @a < = 20
BEGIN
    GOTO a
END

मैं हमेशा बयान WHILEसे अधिक पसंद करता हूं GOTO


1
मुझे पसंद है कि कैसे आपने केवल 1 के बजाय दोनों विकल्पों का उल्लेख किया है जैसे
DanteTheSmith

0

जबकि टी-एसक्यूएल में लूप उदाहरण है जो वर्तमान महीने की शुरुआत से लेकर अंतिम तिथि तक सूचीबद्ध है।

DECLARE @Today DATE= GETDATE() ,
@StartOfMonth DATE ,
@EndOfMonth DATE;

DECLARE @DateList TABLE ( DateLabel VARCHAR(10) );
SET @EndOfMonth = EOMONTH(GETDATE());
SET @StartOfMonth = DATEFROMPARTS(YEAR(@Today), MONTH(@Today), 1);

WHILE @StartOfMonth <= @EndOfMonth
BEGIN
    INSERT  INTO @DateList
    VALUES  ( @StartOfMonth );
    SET @StartOfMonth = DATEADD(DAY, 1, @StartOfMonth);
END;

SELECT  DateLabel
FROM    @DateList;  

0

इसे आज़माएं, इसे जानें:

DECLARE @r INT = 5
DECLARE @i INT = 0
DECLARE @F varchar(max) = ''
WHILE @i < @r
BEGIN

    DECLARE @j INT = 0
    DECLARE @o varchar(max) = ''
    WHILE @j < @r - @i - 1
    BEGIN
        SET @o = @o + ' '
        SET @j += 1
    END

    DECLARE @k INT = 0
    WHILE @k < @i + 1
    BEGIN
        SET @o = @o + ' *'  -- '*'
        SET @k += 1
    END
    SET @i += 1
    SET @F = @F + @o + CHAR(13)
END
PRINT @F

दिनांक के साथ:

DECLARE @d DATE = '2019-11-01'
WHILE @d < GETDATE()
BEGIN
    PRINT @d
    SET @d = DATEADD(DAY,1,@d)
END
PRINT 'n'
PRINT @d
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.