Apakah ada metode untuk mengimplementasikan do while
loop di SQL server 2008?
Apakah ada metode untuk mengimplementasikan do while
loop di SQL server 2008?
Jawaban:
Saya tidak yakin tentang DO-WHILE IN MS SQL Server 2008 tetapi Anda dapat mengubah logika loop WHILE Anda, sehingga dapat MENGGUNAKAN seperti DO-WHILE loop.
Contoh diambil dari sini: http://blog.sqlauthority.com/2007/10/24/sql-server-simple-example-of- While-loop-with-continue- and- break-keywords/
Contoh 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
Contoh WHILE Loop dengan kata kunci 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
Contoh WHILE Loop dengan kata kunci CONTINUE dan 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
Tetapi cobalah untuk menghindari loop pada level database. Referensi .
Jika Anda tidak terlalu tersinggung dengan GOTO
kata kunci tersebut, ini dapat digunakan untuk mensimulasikan a DO
/ WHILE
dalam T-SQL. Pertimbangkan contoh yang agak tidak masuk akal berikut yang ditulis dalam pseudocode:
SET I=1
DO
PRINT I
SET I=I+1
WHILE I<=10
Berikut adalah kode T-SQL yang setara menggunakan goto:
DECLARE @I INT=1;
START: -- DO
PRINT @I;
SET @I+=1;
IF @I<=10 GOTO START; -- WHILE @I<=10
Perhatikan pemetaan satu lawan satu antara GOTO
solusi yang diaktifkan dan yang asli DO
/ WHILE
pseudocode. Implementasi serupa menggunakan WHILE
loop akan terlihat seperti:
DECLARE @I INT=1;
WHILE (1=1) -- DO
BEGIN
PRINT @I;
SET @I+=1;
IF NOT (@I<=10) BREAK; -- WHILE @I<=10
END
Sekarang, tentu saja Anda dapat menulis ulang contoh khusus ini sebagai WHILE
loop sederhana , karena ini bukan kandidat yang baik untuk sebuah DO
/ WHILE
konstruksi. Penekanannya adalah pada contoh singkatnya daripada penerapan, karena kasus sah yang membutuhkan a DO
/ WHILE
jarang terjadi.
REPEAT / UNTIL, siapa saja (TIDAK bekerja di T-SQL)?
SET I=1
REPEAT
PRINT I
SET I=I+1
UNTIL I>10
... dan GOTO
solusi berbasis di T-SQL:
DECLARE @I INT=1;
START: -- REPEAT
PRINT @I;
SET @I+=1;
IF NOT(@I>10) GOTO START; -- UNTIL @I>10
Melalui penggunaan kreatif GOTO
dan inversi logika melalui NOT
kata kunci, ada hubungan yang sangat erat antara kodesemu asli dan GOTO
solusi berbasis. Solusi serupa menggunakan WHILE
loop terlihat seperti:
DECLARE @I INT=1;
WHILE (1=1) -- REPEAT
BEGIN
PRINT @I;
SET @I+=1;
IF @I>10 BREAK; -- UNTIL @I>10
END
Argumen dapat dibuat bahwa untuk kasus REPEAT
/ UNTIL
, WHILE
solusi berbasis lebih sederhana, karena kondisi if tidak terbalik. Di sisi lain juga lebih bertele-tele.
Jika bukan karena semua penghinaan seputar penggunaan GOTO
, ini bahkan mungkin menjadi solusi idiomatik untuk beberapa saat ketika konstruksi perulangan (jahat) khusus ini diperlukan dalam kode T-SQL demi kejelasan.
Gunakan ini sesuai kebijaksanaan Anda, cobalah untuk tidak membuat marah sesama pengembang ketika mereka menangkap Anda menggunakan banyak fitnah GOTO
.
Sepertinya saya ingat pernah membaca artikel ini lebih dari sekali, dan jawabannya hanya mendekati yang saya butuhkan.
Biasanya ketika saya berpikir saya akan membutuhkan DO WHILE
di T-SQL itu karena saya mengulang kursor, dan saya mencari kejelasan optimal (vs. kecepatan optimal). Di T-SQL yang sepertinya cocok dengan WHILE TRUE
/ IF BREAK
.
Jika itu skenario yang membawa Anda ke sini, cuplikan ini dapat menghemat waktu Anda. Jika tidak, selamat datang kembali, saya. Sekarang saya yakin saya pernah ke sini lebih dari sekali. :)
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
Sayangnya, T-SQL tampaknya tidak menawarkan cara yang lebih bersih untuk mendefinisikan operasi loop secara tunggal, daripada loop tak terbatas ini.
Anda juga dapat menggunakan variabel keluar jika Anda ingin kode Anda sedikit lebih mudah dibaca:
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
Ini mungkin akan lebih relevan ketika Anda memiliki loop yang lebih rumit dan mencoba melacak logikanya. Seperti loop yang dinyatakan mahal, jadi coba dan gunakan metode lain jika Anda bisa.
Only While Loop secara resmi didukung oleh SQL server. Jawabannya sudah ada untuk DO while loop. Saya merinci jawaban tentang cara-cara untuk mencapai berbagai jenis loop di SQL server.
Jika Anda tahu, Anda harus menyelesaikan iterasi loop terlebih dahulu, kemudian Anda dapat mencoba versi SQL server DO..WHILE atau 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';