다음을 통해 공유


WHILE(Transact-SQL)

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스

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

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 }

인수

boolean_expression

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

{ sql_statement | statement_block }

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

BREAK

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

CONTINUE

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

설명

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

예제

이 문서의 Transact-SQL 코드 샘플은 AdventureWorks2022 또는 AdventureWorksDW2022 샘플 데이터베이스를 사용하며, 이는 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