Sdílet prostřednictvím


ZATÍMCO (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Nastaví podmínku pro opakované spuštění příkazu nebo bloku příkazu SQL. Příkazy se provádějí opakovaně, pokud je zadaná podmínka pravdivá. Spuštění příkazů ve WHILE smyčce lze ovládat ze smyčky pomocí BREAK klíčových slov a CONTINUE z této smyčky.

Transact-SQL konvence syntaxe

Syntax

Syntaxe pro SQL Server, Azure SQL Database, Azure SQL Managed Instance a Microsoft Fabric.

WHILE boolean_expression
    { sql_statement | statement_block | BREAK | CONTINUE }

Syntaxe pro Azure Synapse Analytics a Platform Platform System (PDW).

WHILE boolean_expression
    { sql_statement | statement_block | BREAK }

Arguments

boolean_expression

Výraz, který vrací TRUE nebo FALSE. Pokud logický výraz obsahuje SELECT příkaz, SELECT musí být příkaz uzavřený v závorkách.

{ sql_statement | statement_block }

Všechny Transact-SQL příkazy nebo seskupení příkazů definované pomocí bloku příkazu. K definování bloku příkazu použijte klíčová slova BEGIN control-of-flow a END.

BREAK

Způsobí ukončení z vnitřní WHILE smyčky. Všechny příkazy, které se zobrazí za END klíčovým slovem a označují konec smyčky, se spustí.

CONTINUE

Restartuje smyčku WHILE . Všechny příkazy za klíčovým slovem CONTINUE se ignorují. CONTINUE je často, ale ne vždy otevřen testem IF . Další informace najdete v tématu Řízení toku.

Remarks

Pokud jsou vnořené dvě nebo více WHILE smyček, vnitřní BREAK ukončí další vnější smyčku. Nejprve se spustí všechny příkazy za koncem vnitřní smyčky a pak se restartuje další vnější smyčka.

Examples

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

A. Použití funkce BREAK a CONTINUE s vnořenou chybou KDYŽ... ELSE a WHILE

Pokud je průměrná ceníková cena produktu nižší než 300 Kč, WHILE smyčka v následujícím příkladu zdvojnásobí ceny a pak vybere maximální cenu. Pokud je maximální cena menší nebo rovna 500 USD, WHILE smyčka se restartuje a znovu zdvojnásobí ceny. Tato smyčka pokračuje ve zdvojnásobení cen, dokud maximální cena není větší než 500 USD, a pak ukončí smyčku WHILE a vytiskne zprávu.

USE AdventureWorks2022;
GO

WHILE (
        SELECT AVG(ListPrice)
        FROM Production.Product
        ) < $300
BEGIN
    UPDATE Production.Product
    SET ListPrice = ListPrice * 2

    SELECT MAX(ListPrice)
    FROM Production.Product

    IF (
        SELECT MAX(ListPrice)
        FROM Production.Product
        ) > $500
        BREAK
    ELSE
        CONTINUE
END

PRINT 'Too much for the market to bear';

B. Použití funkce WHILE v kurzoru

Následující příklad používá @@FETCH_STATUS k řízení aktivit kurzoru ve smyčce WHILE .

DECLARE @EmployeeID AS NVARCHAR(256)
DECLARE @Title AS NVARCHAR(50)

DECLARE Employee_Cursor CURSOR
FOR
SELECT LoginID, JobTitle
FROM AdventureWorks2022.HumanResources.Employee
WHERE JobTitle = 'Marketing Specialist';

OPEN Employee_Cursor;

FETCH NEXT
FROM Employee_Cursor
INTO @EmployeeID, @Title;

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT '   ' + @EmployeeID + '      ' + @Title

    FETCH NEXT
    FROM Employee_Cursor
    INTO @EmployeeID, @Title;
END;

CLOSE Employee_Cursor;

DEALLOCATE Employee_Cursor;
GO

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

C. WHILE smyčka

Pokud je průměrná ceníková cena produktu nižší než 300 Kč, WHILE smyčka v následujícím příkladu zdvojnásobí ceny a pak vybere maximální cenu. Pokud je maximální cena menší nebo rovna 500 USD, WHILE smyčka se restartuje a znovu zdvojnásobí ceny. Tato smyčka pokračuje ve zdvojnásobení cen, dokud maximální cena není vyšší než 500 USD, a poté ukončí smyčku WHILE .

WHILE (
        SELECT AVG(ListPrice)
        FROM dbo.DimProduct
        ) < $300
BEGIN
    UPDATE dbo.DimProduct
    SET ListPrice = ListPrice * 2;

    SELECT MAX(ListPrice)
    FROM dbo.DimProduct

    IF (
            SELECT MAX(ListPrice)
            FROM dbo.DimProduct
            ) > $500
        BREAK;
END