Sintaks untuk-loop di SQL Server

238

Apa sintaks dari forloop di TSQL?

Jantan
sumber
10
SQL adalah bahasa yang sangat berbeda dibandingkan dengan apa yang Anda terbiasa. Ini fokus pada apa , bukan bagaimana . Anda memberi tahu SQL Server hasil apa yang Anda inginkan, dan biarkan ia mencari tahu bagaimana menghasilkan jawabannya. Atau, untuk mengulang kembali apa yang baru saja saya katakan - tidak ada loop untuk di SQL.
Damien_The_Unbeliever
5
WHILE @I < 10; SET @I = @I + 1; BEGIN; ...; END? Namun, ini tidak boleh digunakan untuk sebagian besar pemrosesan permintaan (tetapi kadang-kadang diperlukan untuk manipulasi imperatif). Banyak petunjuk / petunjuk seperti itu tersedia di google menggunakan pencarian "tsql for loop".
7
Hindari loop yang mendukung GABUNG dan mengatur operasi.
Oded
2
Jika Anda bukan ahli dalam SQL, Anda tidak harus mempertimbangkan menggunakan loop. Hanya ada beberapa kondisi di mana seseorang diperlukan dan sebagian besar waktu lainnya, menggunakan loop adalah setara dengan mendorong mobil Anda alih-alih mengendarainya. Belajarlah berpikir dalam hal kumpulan data alih-alih perulangan melalui catatan. LOoping adalah fungsi tingkat ahli bukan karena sintaksinya sulit tetapi karena Anda harus tahu persis seberapa besar kerusakan yang dapat Anda lakukan dengannya sebelum Anda diizinkan untuk menggunakannya.
HLGEM
2
Kadang-kadang itu bisa digunakan untuk menyulap data uji dengan cepat dalam database uji yang baru saja akan Anda hapus segera sesudahnya. Dalam hal ini, menggunakan ini menghilangkan kebutuhan untuk pergi melalui program terpisah yang ditulis dalam sesuatu yang lebih seperti C #, dan teknik tidak terlalu menjadi perhatian utama. Sekali lagi, saya hanya mengatakan ini dalam hal data uji.
Panzercrisis

Jawaban:

210

T-SQL tidak memiliki FORloop, ia memiliki WHILEloop
WHILE (Transact-SQL)

WHILE Boolean_expression
BEGIN

END
selai
sumber
8
BERGABUNG (dan mengatur operasi) harus lebih disukai daripada perulangan konstruksi dalam SQL.
Oded
6
Tidak ada batasan untuk menekankan (terutama bagi mereka yang baru mengenal SQL), apa yang dikatakan Damien: "SQL adalah bahasa yang sangat berbeda dibandingkan dengan apa yang Anda terbiasa. Ini berfokus pada apa, bukan bagaimana. Anda memberi tahu SQL Server apa hasil yang Anda inginkan, dan biarkan mencari tahu cara menghasilkan jawabannya. "
ypercubeᵀᴹ
1
Sangat menarik untuk dicatat bahwa dokumentasi MS salah di sini, sungguh. WHILE tidak mengambil ekspresi boolean - dibutuhkan predikat - yang selain dapat mengevaluasi ke TRUE atau FALSE, juga bisa TIDAK DIKETAHUI.
Damien_The_Unbeliever
360

Tidak ada untuk loop, hanya loop sementara:

DECLARE @i int = 0

WHILE @i < 20
BEGIN
    SET @i = @i + 1
    /* do some work */
END
TcK
sumber
20
Perhatikan bahwa jika Anda berniat menggunakan indeks dalam loop, Anda mungkin ingin menambah hal terakhir, bukan yang pertama, tergantung pada kasus penggunaan Anda.
jinglesthula
3
Perhatikan juga bahwa nilai default untuk variabel lokal tidak didukung dalam SQL biasa. Karenanya Anda perlu terpisah SET @i = 0sebelum untuk loop.
Nux
1
@Nux: 0 diatur selama deklarasi secara eksplisit
TcKs
7
Ya, tapi itu tidak berfungsi pada SQL Server yang lebih lama (setidaknya tidak pada 2005).
Nux
Juga, harus dicatat bahwa umumnya pekerjaan dilakukan sebelum bilangan bulat bertambah. Banyak untuk loop dalam SQL benar-benar menggunakan integer dalam pekerjaan mereka (iterasi dari baris ke baris atau hasil untuk menghasilkan tabel temp) dan dapat dibuang jika peningkatan terjadi pada awal siklus daripada akhir.
CSS
34

Informasi tambahan

Hanya untuk menambahkan karena tidak ada yang memposting jawaban yang mencakup cara untuk benar-benar mengulangi dataset di dalam sebuah loop, Anda dapat menggunakan kata kunci OFFSET FETCH .

Pemakaian

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
Dan Cundy
sumber
2
Alternatif yang bagus untuk menggunakan kursor.
DanteTheSmith
28

DECLARE @intFlag INT
SET @intFlag = 1
WHILE (@intFlag <=5) 
BEGIN
    PRINT @intFlag
    SET @intFlag = @intFlag + 1
END
GO
Kashmir
sumber
13
Selamat Datang di Stack Overflow! Apakah Anda mempertimbangkan untuk menambahkan narasi untuk menjelaskan mengapa kode ini berfungsi, dan apa yang membuatnya menjadi jawaban untuk pertanyaan itu? Ini akan sangat membantu bagi orang yang mengajukan pertanyaan, dan siapa pun yang datang.
Andrew Barber
18
Ini cukup jelas.
Edward Olamisan
4
Bagaimana ini tidak jelas? Saya memiliki pertanyaan yang sama, saya langsung mengerti jawabannya.
DanteTheSmith
1
Apa perbedaan jawaban ini dengan @TcK kecuali konvensi penamaan?
Sushil Jadhav
7

Bagaimana dengan ini:

BEGIN
   Do Something
END
GO 10

... tentu saja Anda bisa memasukkan penghitung tambahan di dalamnya jika Anda perlu menghitung.

i00
sumber
3
'GO 10'? SQL Server 2008 tidak menyukainya.
Sumberdaya
7

Untuk loop belum secara resmi didukung oleh SQL server. Sudah ada jawaban untuk mencapai berbagai cara FOR Loop. Saya merinci jawaban tentang cara untuk mencapai berbagai jenis loop di SQL server.

UNTUK Loop

DECLARE @cnt INT = 0;

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

PRINT 'Done FOR LOOP';

Jika Anda tahu, Anda harus menyelesaikan iterasi pertama dari loop, maka Anda dapat mencoba DO..WHILE atau REPEAT..UNTIL versi SQL server.

DO..WHILE Loop

DECLARE @X INT=1;

WAY:  --> Here the  DO statement

  PRINT @X;

  SET @X += 1;

IF @X<=10 GOTO WAY;

REPEAT..UNTIL Loop

DECLARE @X INT = 1;

WAY:  -- Here the REPEAT statement

  PRINT @X;

  SET @X += 1;

IFNOT(@X > 10) GOTO WAY;

Referensi

Somnath Muluk
sumber
Ini tampaknya telah disalin-tempel-disusun ulang di sini: stackoverflow.com/a/46363319/8239061
SecretAgentMan
@SecretAgentMan: Kedua jawaban menjawab pertanyaan yang berbeda. Data tambahan diberikan dalam kedua jawaban.
Somnath Muluk
6

Jawaban sederhana adalah NO !!.

Tidak ada FORdalam SQL, Tetapi Anda dapat menggunakan WHILEatau GOTOuntuk mencapai cara bagaimana FORakan bekerja.

SAAT:

DECLARE @a INT = 10

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

PERGI KE :

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

Saya selalu lebih suka WHILEdaripada GOTOpernyataan.

Ragul
sumber
1
Saya suka bagaimana Anda menyebutkan kedua alternatif, bukan hanya 1 seperti kebanyakan jawaban
DanteTheSmith
0

Sedangkan Loop contoh dalam T-SQL yang mencantumkan tanggal awal hingga akhir bulan ini.

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;  
Sameer
sumber
0

Cobalah, pelajari:

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

Dengan tanggal:

DECLARE @d DATE = '2019-11-01'
WHILE @d < GETDATE()
BEGIN
    PRINT @d
    SET @d = DATEADD(DAY,1,@d)
END
PRINT 'n'
PRINT @d
Mahesh Mitikiri
sumber