มีวิธีใดในการใช้งานdo while
ลูปใน SQL Server 2008 หรือไม่?
มีวิธีใดในการใช้งานdo while
ลูปใน SQL Server 2008 หรือไม่?
คำตอบ:
ฉันไม่แน่ใจเกี่ยวกับ DO-WHILE ใน MS SQL Server 2008 แต่คุณสามารถเปลี่ยนตรรกะการวนซ้ำในขณะที่ใช้เช่น DO-WHILE loop
ตัวอย่างนำมาจากที่นี่: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of- while-loop-with-continue-and-break-keywords/
ตัวอย่าง WHILE Loop
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 END GO
ResultSet:
1 2 3 4 5
ตัวอย่าง WHILE Loop พร้อมคำหลัก BREAK
DECLARE @intFlag INT SET @intFlag = 1 WHILE (@intFlag <=5) BEGIN PRINT @intFlag SET @intFlag = @intFlag + 1 IF @intFlag = 4 BREAK; END GO
ResultSet:
1 2 3
ตัวอย่าง WHILE Loop ที่มีคำหลัก 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
ResultSet:
1 2 3 4 5
แต่พยายามหลีกเลี่ยงการวนซ้ำในระดับฐานข้อมูล ข้อมูลอ้างอิง .
หากคุณไม่รู้สึกขุ่นเคืองกับGOTO
คีย์เวิร์ดมากนักสามารถใช้เพื่อจำลอง a DO
/ WHILE
ใน T-SQL พิจารณาตัวอย่างที่ค่อนข้างไร้สาระต่อไปนี้ที่เขียนด้วยรหัสเทียม:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
นี่คือรหัส T-SQL ที่เทียบเท่าโดยใช้ goto:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
สังเกตการแมปแบบหนึ่งต่อหนึ่งระหว่างGOTO
โซลูชันที่เปิดใช้งานและโค้ดต้นฉบับDO
/ WHILE
pseudocode การใช้งานที่คล้ายกันโดยใช้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
ลูปง่ายๆได้เนื่องจากนี่ไม่ใช่ตัวเลือกที่ดีสำหรับ a DO
/ WHILE
construction เน้นไปที่ตัวอย่างความสั้นมากกว่าการบังคับใช้เนื่องจากกรณีที่ถูกต้องตามกฎหมายที่ต้องใช้ a DO
/ WHILE
นั้นหายาก
ทำซ้ำ / จนกว่าทุกคน (ไม่ทำงานใน T-SQL)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... และGOTO
โซลูชันที่ใช้ใน T-SQL:
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
สิ่งเหล่านี้อาจเป็นวิธีแก้ปัญหาสำหรับสองสามครั้งเมื่อโครงสร้างการวนซ้ำ (ชั่วร้าย) เหล่านี้เป็นสิ่งจำเป็นในรหัส T-SQL เพื่อความชัดเจน
ใช้เหล่านี้ขึ้นอยู่กับดุลยพินิจของคุณเองพยายามที่จะไม่ประสบความโกรธเกรี้ยวของนักพัฒนาเพื่อนของคุณเมื่อพวกเขาจับคุณใช้มาก GOTO
maligned
ดูเหมือนฉันจะจำได้ว่าอ่านบทความนี้มากกว่าหนึ่งครั้งและคำตอบก็ใกล้เคียงกับสิ่งที่ฉันต้องการเท่านั้น
โดยปกติเมื่อฉันคิดว่าฉันจะต้องใช้DO WHILE
T-SQL นั่นเป็นเพราะฉันกำลังทำเคอร์เซอร์ซ้ำและฉันกำลังมองหาส่วนใหญ่เพื่อความชัดเจนที่ดีที่สุด (เทียบกับความเร็วที่เหมาะสม) ใน T-SQL ที่ดูเหมือนว่าจะพอดีกับ a WHILE TRUE
/ 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
น่าเสียดายที่ T-SQL ดูเหมือนจะไม่มีวิธีที่สะอาดกว่าในการกำหนดการทำงานของลูปแบบเดี่ยว ๆ มากกว่าการวนซ้ำแบบไม่มีที่สิ้นสุดนี้
คุณยังสามารถใช้ตัวแปร exit หากต้องการให้โค้ดของคุณอ่านง่ายขึ้น:
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 รองรับเฉพาะ While Loop เท่านั้น มีคำตอบสำหรับ DO ในขณะที่วนซ้ำอยู่แล้ว ฉันกำลังอธิบายรายละเอียดเกี่ยวกับวิธีการบรรลุลูปประเภทต่างๆในเซิร์ฟเวอร์ SQL
ถ้าคุณรู้ว่าคุณต้องดำเนินการซ้ำครั้งแรกของวงต่อไปแล้วคุณสามารถลองDO..WHILEหรือREPEAT..UNTILรุ่นของเซิร์ฟเวอร์ SQL
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';