SQL Server'da for-loop sözdizimi


238

forTSQL'de bir döngünün sözdizimi nedir ?


10
SQL, alışık olduğunuzdan çok farklı bir dildir. Neye odaklanır, nasıl değil . SQL Server'a hangi sonuçları istediğinizi söylersiniz ve yanıtın nasıl üretileceğini anlarsınız. Ya da, az önce söylediğim şeyi yeniden paylaşmak için - SQL'de bir for döngüsü yoktur.
Damien_The_Unbeliever

5
WHILE @I < 10; SET @I = @I + 1; BEGIN; ...; END? Ancak bu olmalı değil çoğu sorgu işleme için kullanılacak (ama bazen zorunlu manipülasyon için gereklidir). Google'da "tsql for loop" aramasını kullanarak bu tür talimatların / ipuçlarının çoğunu bulabilirsiniz.

7
BAĞLANTILAR ve ayarlanmış işlemler lehine döngülerden kaçının.
Oded

2
SQL konusunda uzman değilseniz, bir döngü kullanmayı düşünmemelisiniz. Birinin gerekli olduğu sadece birkaç koşul vardır ve çoğu zaman bir döngü kullanmak, aracınızı sürmek yerine itmeye eşdeğerdir. Kayıtlar arasında dolaşmak yerine veri kümeleri açısından düşünmeyi öğrenin. Döngü, sözdiziminin zor olduğu için değil, kullanmanıza izin verilmeden önce onunla ne kadar zarar verebileceğinizi tam olarak bilmeniz gerektiğinden uzman düzeyinde bir işlevdir.
HLGEM

2
Bazen, kısa bir süre sonra sileceğiniz bir test veritabanında test verilerini hızlı bir şekilde oluşturmak için kullanılabilir. Bu durumda, bunu kullanmak C # gibi bir şeyle yazılmış ayrı bir programdan geçme ihtiyacını ortadan kaldırır ve mühendislik özellikle büyük bir endişe değildir. Yine, bunu sadece test verileri açısından söylüyorum.
Panzercrisis

Yanıtlar:


210

T-SQL bir yok FORdöngü, bir sahiptir WHILEdöngü
WHILE (Transact-SQL)

WHILE Boolean_expression
BEGIN

END

8
SQL'deki döngü yapılarına göre JOIN'ler (ve set işlemleri) tercih edilmelidir.
Oded

6
Stres üzerinde herhangi bir sınırlama yoktur (özellikle SQL'de yeni olanlar için), Damien'ın söylediği gibi: "SQL, alışık olduğunuza göre çok farklı bir dildir. Neye odaklanır, nasıl değil. SQL Server'a ne söylersiniz istediğiniz
sonuca ulaşın

1
MS belgelerinin burada yanlış olduğunu belirtmek ilginç. DOĞRU veya YANLIŞ olarak değerlendirmenin yanı sıra BİLİNMEYEN de olabilen bir boole ifadesi - bir yüklem gerektirir -.
Damien_The_Unbeliever

360

For-loop yoktur, sadece while döngüsü vardır:

DECLARE @i int = 0

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

20
Dizini döngüde kullanmak istiyorsanız, kullanım durumunuza bağlı olarak ilk yerine son şeyi artırmak isteyebileceğinizi unutmayın.
jinglesthula

3
Ayrıca, yerel değişken için varsayılan değerin düz SQL'de desteklenmediğini unutmayın. Bu yüzden SET @i = 0döngü için daha önce ayrı gerekir .
Nux

1
@Nux: 0, beyanname sırasında açıkça ayarlanır
TcKs

7
Evet, ancak eski SQL Server'larda çalışmaz (en azından 2005'te).
Nux

Ayrıca, tamsayı artırılmadan önce genellikle iş yapıldığına dikkat edilmelidir. SQL'deki döngülerin çoğu, işlerinde bu tamsayıyı kullanır (satırdan satıra yineleme veya geçici tablolarla sonuçlanması için) ve artış, döngünün başında değil de gerçekleşirse atılabilir.
CSS

34

Fazladan bilgi

Sadece hiç kimse bir döngü içinde bir veri kümesi üzerinden gerçekten yineleme nasıl içeren bir cevap yayınlama eklemek için, OFFSET FETCH anahtar kelimelerini kullanabilirsiniz .

kullanım

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
Bir imleç kullanmak için güzel bir alternatif.
DanteTheSmith

28

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

13
Stack Overflow'a hoş geldiniz! Bu kodun neden işe yaradığını ve soruyu sorunun cevabı haline getirmek için bazı anlatılar eklemeyi düşünür müsünüz? Bu, soruyu soran kişiye ve birlikte gelen herkese çok yardımcı olacaktır.
Andrew Barber

18
Bu kendini açıklayıcı.
Edward Olamisan

4
Bu kendini nasıl açıklayıcı değil? Aynı soruyu sordum, cevabı hemen anladım.
DanteTheSmith

1
Bu yanıt adlandırma kuralı dışında @TcKs arasında nasıl farklılık gösterir?
Sushil Jadhav

7

Buna ne dersin:

BEGIN
   Do Something
END
GO 10

... elbette saymanız gerekiyorsa içine artımlı bir sayaç koyabilirsiniz.


3
'GO 10' mu? SQL Server 2008 bunu sevmiyor.
Kaynak

7

For loop henüz SQL sunucusu tarafından resmi olarak desteklenmemektedir. Zaten FOR Loop'un farklı yollarına ulaşmanın cevabı var. SQL Server'da farklı döngü türleri elde etmenin yollarına ilişkin cevabı detaylandırıyorum

Döngü için

DECLARE @cnt INT = 0;

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

PRINT 'Done FOR LOOP';

Eğer biliyorsanız, yine de döngü ilk yinelemesini tamamlamak gerekir, o zaman SQL sunucusunun DO..WHILE veya REPEAT..UNTIL sürümünü deneyebilirsiniz .

DOĞRUDAN DÖNÜŞ

DECLARE @X INT=1;

WAY:  --> Here the  DO statement

  PRINT @X;

  SET @X += 1;

IF @X<=10 GOTO WAY;

REPEAT..UNTIL Döngü

DECLARE @X INT = 1;

WAY:  -- Here the REPEAT statement

  PRINT @X;

  SET @X += 1;

IFNOT(@X > 10) GOTO WAY;

Referans


Bu, kopyalanmış-yapıştırılmış-yeniden düzenlenmiş gibi görünüyor: stackoverflow.com/a/46363319/8239061
SecretAgentMan

@SecretAgentMan: Her iki yanıt da farklı soruları yanıtlıyor. Her iki cevapta da ek veriler verilmiştir.
Somnath Muluk

6

Basit cevap NO !!.

FORSQL'de yok , ama nasıl çalışacağını elde etmek için WHILEveya kullanabilirsiniz .GOTOFOR

SÜRE :

DECLARE @a INT = 10

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

GOTO:

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

Ben her zaman WHILEaşırı GOTOifadeyi tercih ederim .


1
Her iki alternatiften de nasıl bahsettiğinizi seviyorum, çoğu cevap gibi sadece 1
DanteTheSmith

0

Mevcut ayın başlangıç ​​ve bitiş tarihlerini listeleyen T-SQL'de Loop örneği.

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

Deneyin, öğrenin:

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

Tarihli:

DECLARE @d DATE = '2019-11-01'
WHILE @d < GETDATE()
BEGIN
    PRINT @d
    SET @d = DATEADD(DAY,1,@d)
END
PRINT 'n'
PRINT @d
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.