적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
분석 플랫폼 시스템(PDW)
Microsoft Fabric의 SQL 분석 엔드포인트
Microsoft Fabric의 웨어하우스
Microsoft Fabric의 SQL 데이터베이스
Transact-SQL 문장들의 시퀀스를 논리적 코드 블록으로 감싸 넣습니다. 이 사용은 BEGIN 와 BEGIN ATOMIC 진술과는 BEGIN TRANSACTION 무관합니다.
, 와 WHILE같이 앞에 흐름 제어 명ELSEIF이 붙은 블록을 사용할 BEGIN...END 수 있습니다. 하지만 앞서 흐름 제어 문장 없이 이 블록들을 사용하여 문장 시퀀스를 체계적으로 그룹화할 수도 있습니다. 하지만 새로운 BEGIN...END 블록마다 새로운 어휘 범위가 생성되지는 않습니다.
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 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있습니다.
A. 논리적으로 관련된 명제들의 순서대로 정의하세요
다음 예시에서, BEGIN 와 END 는 순서대로 실행될 논리적으로 관련된 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
다음 예에서 BEGIN 및 END는 함께 실행되는 일련의 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. 함께 실행되는 일련의 명제를 정의하세요
다음 예에서 BEGIN 및 END는 함께 실행되는 일련의 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