다음을 통해 공유


시작되다... 끝 (Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics분석 플랫폼 시스템(PDW)Microsoft Fabric의 SQL 분석 엔드포인트Microsoft Fabric의 웨어하우스Microsoft Fabric의 SQL 데이터베이스

Transact-SQL 문장들의 시퀀스를 논리적 코드 블록으로 감싸 넣습니다. 이 사용은 BEGINBEGIN ATOMIC 진술과는 BEGIN TRANSACTION 무관합니다.

, 와 WHILE같이 앞에 흐름 제어 명ELSEIF이 붙은 블록을 사용할 BEGIN...END 수 있습니다. 하지만 앞서 흐름 제어 문장 없이 이 블록들을 사용하여 문장 시퀀스를 체계적으로 그룹화할 수도 있습니다. 하지만 새로운 BEGIN...END 블록마다 새로운 어휘 범위가 생성되지는 않습니다.

Transact-SQL 구문 표기 규칙

Syntax

BEGIN [ ; ]
    { sql_statement | statement_block }
END [ ; ]

Arguments

{ sql_statement | statement_block}

문 블록을 사용하여 정의된 유효한 Transact-SQL 문 또는 문 그룹화입니다.

Remarks

블록은 BEGIN...END 최소 하나의 문장을 포함해야 합니다. 빈 BEGIN...END 블록을 사용하려 하면 각 키워드 뒤에 세미콜론을 써도 문법 오류가 발생합니다. 빈 BEGIN...END 블록을 피하려면 라벨을 GOTO 자리 표시 문으로 사용하면 됩니다. 예시 C: 동적으로 생성된 BEGIN... 엔드 블록.

BEGIN...END 블록을 중첩할 수 있습니다.

BEGIN...END 블록은 어휘 범위를 정의하지 않습니다. 블록 내에서 변수를 선언하면, 문장이 포함된 DECLARE 블록 내뿐만 아니라 부모 배치 전체에서 볼 수 있습니다.

블록을 여러 배치에 걸쳐 사용할 BEGIN...END 수 없습니다. 예를 들어, 블록 내부 BEGIN...END 에서는 배치 분리기를 사용할 GO 수 없습니다.

명문을 그룹화하기 위해 블록을 BEGIN...END 쓴다고 해서 그룹 내 모든 문장이 원자적으로 실행된다는 뜻은 아닙니다. 트랜잭션 외부에서 배치가 실행되고 오류가 발생하거나 멀티어트 BEGIN...END 먼트 블록의 두 번째 문장에서 예외가 발생하면, 첫 번째 문장은 롤백되지 않습니다.

와 키워드 뒤의 BEGIN 세미콜론은 선택 사항이지만, 다음 경우를 제외하고 권장됩니다:END

  • 공통 표 표현식(CTE)을 시작하는 키워드 앞에 WITH 세미콜론이 필요합니다.

  • 블록 안에 문장이 THROW 포함된 세미콜론이 필요합니다.

  • 또는 문장과 BEGIN TRANSACTIONBEGIN ATOMIC 혼동을 피하기 위해 세 BEGIN 미콜론을 사용하세요.

  • 세미콜론 후 END 를 사용하면 이후 문장, 특히 WITH 키워드나 THROW 문장에 앞에 세미콜론이 필요하지 않도록 합니다.

모든 Transact-SQL 문장은 블록 내에서 BEGIN...END 유효하지만, 특정 Transact-SQL 문장을 같은 배치나 문장 블록 내에 묶어서는 안 됩니다. 명세서가 기존 Transact-SQL 배치 요구사항과 충돌하지 않도록 하세요.

Examples

이 문서의 코드 샘플은 AdventureWorks2025 또는 AdventureWorksDW2025 샘플 데이터베이스를 사용합니다. 이 데이터베이스는 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있습니다.

다음 예시에서, BEGINEND 는 순서대로 실행될 논리적으로 관련된 Transact-SQL 문들의 시퀀스를 정의합니다. 예시는 중첩된 블록도 보여줍니다.

USE AdventureWorks2025;
GO

DECLARE @personId AS INT = (
    SELECT p.BusinessEntityID
    FROM Person.Person AS p
    WHERE p.rowguid = { GUID '92C4279F-1207-48A3-8448-4636514EB7E2' }
);

IF (@personId IS NULL)
    THROW 50001, 'Person not found.', 1;

/* Concatenate the person's name fields: */;
BEGIN
    DECLARE @title AS NVARCHAR (8),
            @first AS NVARCHAR (50),
            @middle AS NVARCHAR (50),
            @last AS NVARCHAR (50),
            @suffix AS NVARCHAR (10);

    SELECT @title = NULLIF (p.Title, N''),
           @first = p.FirstName,
           @middle = NULLIF (p.MiddleName, N''),
           @last = p.LastName,
           @suffix = NULLIF (p.Suffix, N'')
    FROM Person.Person AS p
    WHERE p.BusinessEntityID = @personId;

    DECLARE @nameConcat AS NVARCHAR (255) = CONCAT_WS(N' ', @title, @first, @middle, @last, @suffix);

    /* This is a nested BEGIN...END block: */;
    BEGIN
        DECLARE @emails AS NVARCHAR (MAX) = (
            SELECT STRING_AGG(e.EmailAddress, /*separator:*/N'; ')
            FROM Person.EmailAddress AS e
            WHERE e.BusinessEntityID = @personId
        );

        SET @nameConcat = CONCAT(@nameConcat, N' (', @emails, N')');
    END
END

/* BEGIN...END blocks do not define a lexical scope, so
   even though @nameAndEmails is declared above, it is
   still in-scope after the END keyword. */
SELECT @nameConcat AS NameAndEmails;

B. Use BEGIN... 트랜잭션에서 END

다음 예에서 BEGINEND는 함께 실행되는 일련의 Transact-SQL 문을 정의합니다. 블록이 BEGIN...END 포함되지 않으면 두 문장 모두 ROLLBACK TRANSACTION 실행되고 두 메시지 모두 PRINT 반환됩니다.

USE AdventureWorks2025;
GO

BEGIN TRANSACTION;

IF @@TRANCOUNT = 0
    BEGIN
        SELECT FirstName,
               MiddleName
        FROM Person.Person
        WHERE LastName = 'Adams';

        ROLLBACK TRANSACTION;

        PRINT N'Rolling back the transaction two times causes an error.';
    END

ROLLBACK TRANSACTION;

PRINT N'Rolled back the transaction.';

C. 동적으로 생성되는 BEGIN...에는 GOTO 레이블을 사용하세요. 엔드 블록

블록으로 BEGIN...END 동적 Transact-SQL을 생성하고 키워드를 항상 렌더링 BEGIN...END 하게 하고 싶다면, 빈 블록을 피 BEGIN...END 하기 위해 라벨을 임시 표시 문으로 사용할 GOTO 수 있습니다.

BEGIN
    unusedLabel:
END

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

C. 함께 실행되는 일련의 명제를 정의하세요

다음 예에서 BEGINEND는 함께 실행되는 일련의 SQL 문을 정의합니다.

주의

그리고 END 키워드를 BEGIN 제거하면, 다음 예시는 무한 루프를 반복합니다. 문장은 WHILE 쿼리만 SELECT 반복하며, 문장에 SET @Iteration += 1 도달하지 않습니다.

-- Uses AdventureWorksDW;
DECLARE @Iteration AS INT = 0;

WHILE @Iteration < 10
    BEGIN
        SELECT FirstName,
               MiddleName
        FROM dbo.DimCustomer
        WHERE LastName = 'Adams';
        SET @Iteration + = 1;
    END