Aracılığıyla paylaş


BAŞLAMAK... SON (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiAzure Synapse AnalyticsAnaliz Platformu Sistemi (PDW)Microsoft Fabric'teki SQL analiz uç noktasıMicrosoft Fabric'teki ambarMicrosoft Fabric'teki SQL veritabanı

Mantıksal bir kod bloğuna Transact-SQL ime dizisini kaplar. Bu kullanım BEGIN ve BEGIN ATOMIC ifadeleriyle BEGIN TRANSACTION ilgisizdir.

BEGIN...END Önceden gelen bir akış kontrol ifadesi olan blokları kullanabilirsiniz, örneğin IF, ELSE, ve WHILE. Ancak, bu blokları önceden herhangi bir akış kontrol ifadesi olmadan da ifadeler dizilerini organize bir şekilde gruplamak için kullanabilirsiniz. Ancak her yeni BEGIN...END blok yeni bir sözcük kapsamı yaratmaz.

Transact-SQL söz dizimi kuralları

Syntax

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

Arguments

{ sql_statement | statement_block }

Deyim bloğu kullanılarak tanımlanan geçerli Transact-SQL deyimi veya deyim gruplandırma.

Remarks

Bir BEGIN...END blok en az bir ifade içermelidir. Boş BEGIN...END bir blok kullanmaya çalışırsanız, her anahtar kelimeden sonra nokta virgül kullansanız bile sözdizimi hatası alırsınız. Boş BEGIN...END bloklardan kaçınmak için bir GOTO etiketi yer tutucu ifadesi olarak kullanabilirsin. Örnek C'ye Bakınız: Dinamik olarak oluşturulan BEGIN için GOTO etiketi kullanın... END blokları.

BEGIN...END bloklar iç içe yerleştirilebilir.

BEGIN...END Bloklar herhangi bir sözcük kapsamı tanımlamıyor. Bir değişkeni bir blok içinde ilan ederseniz, bu sadece ifadeyi içeren DECLARE blok içinde değil, ana grup boyunca görünürdür.

Birden fazla partide blok kullanamazsınız BEGIN...END . Örneğin, bir blok içinde toplu ayırıcıyı BEGIN...END kullanamazsınızGO.

Blok BEGIN...END ifadeleri kullanmak grup ifadelerinin atomik olarak çalıştığı anlamına gelmez. Bir toplu işlem dışında çalıştığında ve çoklu ifade BEGIN...END bloğunun ikinci ifadesi tarafından hata ortaya çıkarıldığında veya bir istisna atıldığında, ilk ifade geri alınmaz.

ve anahtar kelimelerinden sonra BEGIN nokta virgül kullanmak isteğe bağlıdır ancak önerilir, aşağıdaki durumlar dışında:END

  • Ortak tablo ifadesini (CTE) başlatan WITH anahtar kelimeden önce noktalı virgül gerekir.

  • Bir blok içinde bir THROW nokta noktası olan noktalı virgül gerekir.

  • Or BEGIN ATOMIC ifadeleriyle BEGIN TRANSACTION karışıklığı önlemek için nokta virgül kullanınBEGIN.

  • Nokta virgül kullanmak END , sonraki herhangi bir ifadenin, özellikle anahtar WITH kelime veya THROW ifadenin önündeki nokta virgül gerektirmemesini sağlar.

Tüm Transact-SQL ifadeleri bir BEGIN...END blok içinde geçerli olsa da, belirli Transact-SQL ifadelerini aynı grup veya ifade bloğunda bir araya getirmemelisiniz. Açıklamaların mevcut Transact-SQL parti gereksinimleriyle çakışmadığından emin olun.

Examples

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

Aşağıdaki örnekte BEGIN , END ve mantıksal olarak ilişkili Transact-SQL ifadelerinin sıralarını sırayla çalıştırmak için tanımlayın. Örnek ayrıca iç içe blokları da gösteriyor.

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. BEGIN kullanın... Bir işlemde END

Aşağıdaki örnekte birlikte BEGINEND yürütülen bir dizi Transact-SQL deyimi tanımlayın. Blok BEGIN...END dahil edilmediyse, her iki ROLLBACK TRANSACTION ifade de çalıştırılır ve her iki PRINT mesaj da geri döner.

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. Dinamik olarak oluşturulan BEGIN için bir GOTO etiketi kullanın... END blokları

Bir BEGIN...END blokla dinamik Transact-SQL üretiyorsanız ve programınızın anahtar kelimeleri BEGIN...END her zaman render etmesini istiyorsanız, boş BEGIN...END blok olmasını önlemek için bir GOTO etiketi yer tutucu ifade olarak kullanabilirsiniz.

BEGIN
    unusedLabel:
END

Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)

C. Birlikte çalışan bir dizi ifade tanımlayın

Aşağıdaki örnekte birlikte BEGINEND çalışan bir dizi SQL deyimi tanımlayın.

Dikkat

ve END anahtar kelimelerini BEGIN çıkarırsanız, aşağıdaki örnek sonsuz bir döngüde çalışır. Ifade WHILE yalnızca sorguyu SELECT döngüye alır ve asla ifadeye SET @Iteration += 1 ulaşmaz.

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

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