do while
SQL सर्वर 2008 में लूप को लागू करने के लिए कोई विधि है ?
do while
SQL सर्वर 2008 में लूप को लागू करने के लिए कोई विधि है ?
जवाबों:
मुझे MS SQL Server 2008 में DO-WHILE IN के बारे में निश्चित नहीं है लेकिन आप अपने WHILE लूप लॉजिक को बदल सकते हैं, ताकि DO-WHILE लूप की तरह उपयोग कर सकें।
उदाहरण यहाँ से लिए गए हैं: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of-ward-loop-with-continue-and-break-swords/
WHILE लूप का उदाहरण
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO
परिणाम सेट:
1 2 3 4 5
BREAK कीवर्ड के साथ WHILE लूप का उदाहरण
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO
परिणाम सेट:
1 2 3
WHIN लूप का उदाहरण CONTINUE और BREAK कीवर्ड के साथ
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 CONTINUE; IF @intFlag = 4 -- This will never executed BREAK; END GO
परिणाम सेट:
1 2 3 4 5
लेकिन डेटाबेस स्तर पर छोरों से बचने की कोशिश करें । संदर्भ ।
यदि आप GOTO
कीवर्ड से बहुत नाराज नहीं हैं , तो इसका उपयोग T-SQL में a DO
/ simulate करने के लिए किया जा सकता है WHILE
। Pseudocode में लिखे गए बल्कि निरर्थक उदाहरण पर विचार करें:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
यहाँ गोटो का उपयोग करते हुए बराबर T-SQL कोड है:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
GOTO
सक्षम समाधान और मूल DO
/ WHILE
स्यूडोकोड के बीच एक से एक मैपिंग पर ध्यान दें । WHILE
लूप का उपयोग करते हुए एक समान कार्यान्वयन इस तरह दिखेगा:
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
अब, आप निश्चित रूप से इस विशेष उदाहरण को एक साधारण WHILE
लूप के रूप में फिर से लिख सकते हैं , क्योंकि यह DO
/ WHILE
निर्माण के लिए इतना अच्छा उम्मीदवार नहीं है । उदाहरण के लिए प्रयोज्यता के बजाय संक्षिप्तता पर जोर दिया गया था, क्योंकि वैध मामलों की आवश्यकता होती है a DO
/ WHILE
दुर्लभ हैं।
REPEAT / UNTIL, कोई भी (T-SQL में काम नहीं करता है)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... और GOTO
टी-एसक्यूएल में आधारित समाधान:
DECLARE @I INT=1;
START: -- REPEAT
PRINT @I;
SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10
कीवर्ड के GOTO
माध्यम से और तर्क व्युत्क्रम के रचनात्मक उपयोग के माध्यम से NOT
, मूल स्यूडोकोड और GOTO
आधारित समाधान के बीच एक बहुत करीबी रिश्ता है । WHILE
लूप का उपयोग करने वाला एक समान समाधान जैसा दिखता है:
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
एक तर्क दिया जा सकता है कि REPEAT
/ UNTIL
, के मामले के लिएWHILE
आधारित समाधान सरल है, क्योंकि यदि स्थिति उलटी नहीं है। दूसरी ओर यह अधिक क्रियात्मक भी है।
यदि यह सभी के उपयोग के आसपास तिरस्कार के लिए नहीं था GOTO
, तो ये कुछ समय के लिए मुहावरेदार समाधान भी हो सकते हैं, जब ये विशेष (बुराई) लूपिंग निर्माण स्पष्टता के लिए टी-एसक्यूएल कोड में आवश्यक होते हैं।
अपने विवेक पर इनका उपयोग करें, अपने साथी डेवलपर्स के क्रोध को न झेलने की कोशिश करें जब वे आपको बहुत बदनाम का उपयोग करके पकड़ते हैं GOTO
।
मैं एक बार से अधिक यह लेख पढ़ याद करने लगते हैं, और जवाब केवल है पास मैं क्या जरूरत है।
आमतौर पर जब मुझे लगता है कि मुझे DO WHILE
टी-एसक्यूएल में जरूरत पड़ने वाली है , क्योंकि मैं एक कर्सर को परेशान कर रहा हूं, और मैं काफी हद तक इष्टतम स्पष्टता (बनाम इष्टतम गति) की तलाश में हूं। T-SQL में जो a WHILE TRUE
/ fit लगता है IF BREAK
।
यदि यह ऐसा परिदृश्य है जो आपको यहां लाया है, तो यह स्निपेट आपको एक पल बचा सकता है। अन्यथा, मेरा स्वागत है, मुझे। अब मैं निश्चित हो सकता हूं कि मैं यहां एक से अधिक बार गया हूं। :)
DECLARE Id INT, @Title VARCHAR(50)
DECLARE Iterator CURSOR FORWARD_ONLY FOR
SELECT Id, Title FROM dbo.SourceTable
OPEN Iterator
WHILE 1=1 BEGIN
FETCH NEXT FROM @InputTable INTO @Id, @Title
IF @@FETCH_STATUS < 0 BREAK
PRINT 'Do something with ' + @Title
END
CLOSE Iterator
DEALLOCATE Iterator
दुर्भाग्य से, टी-एसक्यूएल इस अनंत लूप की तुलना में, लूप ऑपरेशन को एकल-परिभाषित करने के लिए एक क्लीनर तरीका प्रदान नहीं करता है।
यदि आप चाहते हैं कि आपका कोड थोड़ा अधिक पठनीय हो तो आप एक निकास चर का उपयोग कर सकते हैं:
DECLARE @Flag int = 0
DECLARE @Done bit = 0
WHILE @Done = 0 BEGIN
SET @Flag = @Flag + 1
PRINT @Flag
IF @Flag >= 5 SET @Done = 1
END
यह संभवतः अधिक प्रासंगिक होगा जब आपके पास अधिक जटिल लूप होगा और तर्क का ट्रैक रखने की कोशिश कर रहे हैं। जैसा कि कहा गया है कि लूप महंगे हैं इसलिए यदि आप कर सकते हैं तो अन्य तरीकों का उपयोग करें।
केवल जबकि लूप आधिकारिक तौर पर SQL सर्वर द्वारा समर्थित है। पहले से ही जवाब है लूप के दौरान डीओ के लिए । मैं SQL सर्वर में विभिन्न प्रकार के लूप प्राप्त करने के तरीकों पर उत्तर का विवरण दे रहा हूं।
यदि आप जानते हैं, तो आपको लूप के पहले पुनरावृत्ति को पूरा करने की आवश्यकता है, फिर आप SQL सर्वर का DO..WHILE या REPEAT..UNTIL संस्करण आज़मा सकते हैं ।
DECLARE @X INT=1;
WAY: --> Here the DO statement
PRINT @X;
SET @X += 1;
IF @X<=10 GOTO WAY;
DECLARE @X INT = 1;
WAY: -- Here the REPEAT statement
PRINT @X;
SET @X += 1;
IFNOT(@X > 10) GOTO WAY;
DECLARE @cnt INT = 0;
WHILE @cnt < 10
BEGIN
PRINT 'Inside FOR LOOP';
SET @cnt = @cnt + 1;
END;
PRINT 'Done FOR LOOP';