Share via


WHILE(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System(PDW)Microsoft Fabric의 SQL 분석 엔드포인트Microsoft Fabric의 Warehouse

SQL 문 또는 문 블록의 반복 실행을 위한 조건을 설정합니다. 문은 지정된 조건이 true인 한 반복적으로 실행됩니다. 루프의 WHILE 문 실행은 루프 내에서 BREAK 제어할 수 있으며 CONTINUE 키워드(keyword).

Transact-SQL 구문 표기 규칙

구문

SQL Server, Azure SQL Database, Azure SQL Managed Instance 및 Microsoft Fabric에 대한 구문입니다.

WHILE boolean_expression
    { sql_statement | statement_block | BREAK | CONTINUE }

Azure Synapse Analytics 및 Analytics Platform System(PDW)에 대한 구문입니다.

WHILE boolean_expression
    { sql_statement | statement_block | BREAK }

참고 항목

SQL Server 2014(12.x) 및 이전 버전에 대한 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조 하세요.

인수

boolean_expression

반환 TRUE 하거나 FALSE. 부울 식에 문이 포함된 SELECT 경우 문은 SELECT 괄호로 묶어야 합니다.

{ sql_statement | statement_block }

문 블록으로 정의된 Transact-SQL 문 또는 문 그룹화 문 블록을 정의하려면 흐름 제어 키워드(keyword) 및 BEGINEND.

BREAK

가장 WHILE 안쪽 루프에서 종료합니다. 루프의 끝을 표시하는 키워드(keyword) 다음에 END 나타나는 모든 문이 실행됩니다.

CONTINUE

루프를 다시 시작 WHILE 합니다. 키워드(keyword) 이후의 CONTINUE 모든 문은 무시됩니다. CONTINUE 는 테스트에 의해 자주 열리지만 항상 열리는 것은 IF 아닙니다. 자세한 내용은 흐름 제어를 참조 하세요.

설명

둘 이상의 WHILE 루프가 중첩되면 내부 BREAK 는 다음 가장 바깥쪽 루프로 종료됩니다. 먼저 내부 루프의 끝 이후에 있는 모든 문이 실행된 다음 바깥쪽 루프가 다시 시작됩니다.

예제

이 문서의 Transact-SQL 코드 샘플은 AdventureWorks2022 샘플 데이터베이스를 사용하며, 이는 Microsoft SQL Server 예시 및 커뮤니티 프로젝트(Microsoft SQL Server Samples and Community Projects) 홈 페이지에서 다운로드할 수 있습니다.

A. 중첩된 IF와 함께 BREAK 및 CONTINUE 사용... ELSE 및 WHILE

다음 예제에서 제품의 평균 정가가 $300 미만이면 루프는 WHILE 가격을 두 배로 곱한 다음 최대 가격을 선택합니다. 최대 가격이 $500보다 작거나 같으면 루프가 WHILE 다시 시작되고 가격이 다시 두 배가 됩니다. 이 루프는 최대 가격이 $500보다 클 때까지 가격을 계속 두 배로 늘리고 루프를 WHILE 종료하고 메시지를 출력합니다.

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. 커서에서 WHILE 사용

다음 예에서는 @@FETCH_STATUS를 사용하여 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

예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)

C: WHILE 루프

다음 예제에서 제품의 평균 정가가 $300 미만이면 루프는 WHILE 가격을 두 배로 곱한 다음 최대 가격을 선택합니다. 최대 가격이 $500보다 작거나 같으면 루프가 WHILE 다시 시작되고 가격이 다시 두 배가 됩니다. 이 루프는 최대 가격이 $500보다 클 때까지 가격을 계속 두 배로 늘리고 루프를 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