Syntax der for-Schleife in SQL Server


238

Was ist die Syntax einer forSchleife in TSQL?


10
SQL ist eine ganz andere Sprache als Sie es gewohnt sind. Es konzentriert sich auf was , nicht wie . Sie teilen SQL Server mit, welche Ergebnisse Sie erzielen möchten, und lassen es herausfinden, wie die Antwort erstellt werden soll. Oder, um noch einmal zu verdeutlichen, was ich gerade gesagt habe: In SQL gibt es keine for-Schleife.
Damien_The_Unbeliever

5
WHILE @I < 10; SET @I = @I + 1; BEGIN; ...; END? Dies sollte jedoch für die meisten Abfrageverarbeitungen nicht verwendet werden (ist jedoch manchmal für eine zwingende Manipulation erforderlich). Viele solcher Anweisungen / Hinweise sind bei Google über die Suche "tsql for loop" verfügbar.

7
Vermeiden Sie Schleifen zugunsten von JOINs und setzen Sie Operationen.
Oded

2
Wenn Sie kein SQL-Experte sind, sollten Sie nicht in Betracht ziehen, eine Schleife zu verwenden. Es gibt nur wenige Bedingungen, unter denen eine benötigt wird, und die meiste Zeit der Zeit entspricht die Verwendung einer Schleife dem Schieben Ihres Autos, anstatt es zu fahren. Lernen Sie, in Datensätzen zu denken, anstatt Datensätze zu durchlaufen. LOoping ist eine Funktion auf Expertenebene, nicht weil die Syntax schwierig ist, sondern weil Sie genau wissen müssen, wie viel Schaden Sie damit anrichten können, bevor Sie sie verwenden dürfen.
HLGEM

2
Manchmal kann es verwendet werden, um schnell Testdaten in einer Testdatenbank zu zaubern, die Sie ohnehin bald danach löschen werden. In diesem Fall entfällt die Verwendung eines separaten Programms, das eher in C # geschrieben ist, und das Engineering ist kein besonderes Problem. Wiederum sage ich dies nur in Bezug auf Testdaten.
Panzercrisis

Antworten:


210

T-SQL hat keine FORSchleife, es hat eine WHILESchleife
WHILE (Transact-SQL)

WHILE Boolean_expression
BEGIN

END

8
JOINs (und Set-Operationen) sollten Schleifenkonstrukten in SQL vorgezogen werden.
Oded

6
Es gibt keine Begrenzung für Stress (insbesondere für diejenigen, die neu in SQL sind), was Damien sagte: "SQL ist eine ganz andere Sprache als Sie es gewohnt sind. Es konzentriert sich auf was, nicht wie. Sie sagen SQL Server was Ergebnisse, die Sie wollen, und lassen Sie es herausfinden, wie die Antwort zu produzieren. "
ypercubeᵀᴹ

1
Es ist interessant festzustellen, dass die MS-Dokumentation hier wirklich falsch ist. WÄHREND kein boolescher Ausdruck verwendet wird - es wird ein Prädikat verwendet -, das nicht nur als WAHR oder FALSCH ausgewertet werden kann, sondern auch UNBEKANNT sein kann.
Damien_The_Unbeliever

359

Es gibt keine for-Schleife, nur die while-Schleife:

DECLARE @i int = 0

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

20
Beachten Sie, dass Sie, wenn Sie den Index in der Schleife verwenden möchten, je nach Anwendungsfall möglicherweise das Letzte anstelle des Ersten erhöhen möchten.
Jinglesthula

3
Beachten Sie außerdem, dass der Standardwert für die lokale Variable in einfachem SQL nicht unterstützt wird. Daher benötigen Sie separate SET @i = 0for for-Schleife.
Nux

1
@Nux: Die 0 wird während der Deklaration explizit gesetzt
TcKs

7
Ja, aber das funktioniert auf älteren SQL Servern nicht (zumindest nicht auf 2005).
Nux

Es sollte auch beachtet werden, dass im Allgemeinen gearbeitet wird, bevor die Ganzzahl inkrementiert wird. Viele for-Schleifen in SQL verwenden diese Ganzzahl tatsächlich in ihrer Arbeit (Iteration von Zeile zu Zeile oder Ergebnis zu temporären Tabellen) und werden möglicherweise verworfen, wenn das Inkrement eher am Anfang des Zyklus als am Ende erfolgt.
CSS

34

Zusatzinformation

Nur um hinzuzufügen, dass niemand eine Antwort gepostet hat, die enthält, wie ein Datensatz innerhalb einer Schleife tatsächlich durchlaufen wird, können Sie die Schlüsselwörter OFFSET FETCH verwenden .

Verwendung

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
Schöne Alternative zur Verwendung eines Cursors.
DanteTheSmith

28

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

13
Willkommen bei Stack Overflow! Würden Sie eine Erzählung hinzufügen, um zu erklären, warum dieser Code funktioniert und was ihn zu einer Antwort auf die Frage macht? Dies wäre sehr hilfreich für die Person, die die Frage stellt, und für alle anderen, die mitkommen.
Andrew Barber

18
Dies ist selbsterklärend.
Edward Olamisan

4
Wie ist das nicht selbsterklärend? Ich hatte die gleiche Frage, ich verstand die Antwort sofort.
DanteTheSmith

1
Wie unterscheidet sich diese Antwort von @TcKs mit Ausnahme der Namenskonvention?
Sushil Jadhav

7

Wie wäre es damit:

BEGIN
   Do Something
END
GO 10

... natürlich können Sie einen inkrementellen Zähler einfügen, wenn Sie zählen müssen.


3
'GO 10'? SQL Server 2008 mag es nicht.
Ressource

7

For-Schleife wird vom SQL Server noch nicht offiziell unterstützt. Es gibt bereits eine Antwort auf die verschiedenen Möglichkeiten von FOR Loop. Ich erläutere die Antwort auf Möglichkeiten, um verschiedene Arten von Schleifen in SQL Server zu erreichen.

FOR-Schleife

DECLARE @cnt INT = 0;

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

PRINT 'Done FOR LOOP';

Wenn Sie wissen, dass Sie die erste Iteration der Schleife trotzdem abschließen müssen, können Sie die Version DO..WHILE oder REPEAT..UNTIL von SQL Server ausprobieren .

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;

Referenz


Dies scheint hier kopiert, eingefügt und neu angeordnet worden zu sein: stackoverflow.com/a/46363319/8239061
SecretAgentMan

@SecretAgentMan: Beide Antworten beantworten unterschiedliche Fragen. Zusätzliche Daten in beiden Antworten.
Somnath Muluk

6

Einfache Antwort ist NO !!.

Es gibt kein FORin SQL, aber Sie können verwenden WHILEoder GOTOerreichen, wie das FORfunktioniert.

WÄHREND:

DECLARE @a INT = 10

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

GEHE ZU :

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

Ich ziehe WHILEimmer GOTOAussagen vor.


1
Mir gefällt, wie Sie beide Alternativen erwähnt haben, stattdessen nur 1, wie die meisten Antworten
DanteTheSmith

0

Beispiel für eine While-Schleife in T-SQL, in der das Anfangs- bis Enddatum des aktuellen Monats aufgeführt ist.

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

Probieren Sie es aus, lernen Sie es:

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

Mit Datum:

DECLARE @d DATE = '2019-11-01'
WHILE @d < GETDATE()
BEGIN
    PRINT @d
    SET @d = DATEADD(DAY,1,@d)
END
PRINT 'n'
PRINT @d
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.