Sdílet prostřednictvím


ZAČÍT... KONEC (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Uzavírá sekvenci Transact-SQL příkazů do logického bloku kódu. Toto použití není BEGIN spojeno s BEGIN TRANSACTION výroky a BEGIN ATOMIC .

Můžete použít BEGIN...END bloky s předchozím příkazem řízení toku, jako IFjsou , ELSE, a WHILE. Tyto bloky však můžete také použít bez předchozího příkazu řízení toku k organizovanému seskupení sekvencí příkazů. Každý nový BEGIN...END blok však nevytváří nový lexikální rozsah.

Transact-SQL konvence syntaxe

Syntax

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

Arguments

{ sql_statement | statement_block }

Libovolný platný příkaz Transact-SQL nebo seskupení příkazů definovaný pomocí bloku příkazu.

Remarks

Blok BEGIN...END musí obsahovat alespoň jedno tvrzení. Pokud se pokusíte použít prázdný BEGIN...END blok, dostanete chybu syntaxe, i když za každým klíčovým slovem použijete středník. Prázdným BEGIN...END blokům se vyhneš použitím štítku GOTO jako dočasného příkazu. Viz příklad C: Použijte označení GOTO pro dynamicky generovaný BEGIN... END bloky.

BEGIN...END bloky lze vnořit.

BEGIN...END bloky nedefinují žádný lexikální rozsah. Pokud deklarujete proměnnou uvnitř bloku, je viditelná v celé rodičovské dávce, nejen v bloku obsahujícím daný DECLARE příkaz.

Nemůžete používat BEGIN...END bloky napříč více dávkami. Například nemůžete použít GO dávkový oddělovač uvnitř bloku BEGIN...END .

Použití příkazů BEGIN...END blok k seskupení neznamená, že všechny příkazy ve skupině běží atomicky. Když dávka běží mimo transakci a druhý příkaz vícepříkazového BEGIN...END bloku vyvolá chybu nebo je vyhozena výjimka, první příkaz se nevrátí zpět.

Středníky za BEGINEND a klíčová slova jsou volitelné, ale doporučovány, kromě následujících případů:

  • Před klíčovým slovem WITH , které začíná běžný výraz v tabulce (CTE), je potřeba středník.

  • Potřebujete středník s tvrzením THROW do bloku.

  • Použijte středník za slovy BEGIN , abyste předešli záměně s BEGIN TRANSACTION výroky or BEGIN ATOMIC .

  • Použití středníku po něm END zajistí, že jakýkoli následující výrok, zejména klíčové slovo WITH nebo THROW výrok, nepotřebuje předcházející středník.

Ačkoliv jsou všechny Transact-SQL příkazy platné v rámci bloku BEGIN...END , neměli byste některé Transact-SQL příkazy seskupovat v rámci stejné dávky nebo bloku příkazů. Ujistěte se, že výkazy nejsou v rozporu s existujícími požadavky Transact-SQL dávky.

Examples

Ukázky kódu v tomto článku používají ukázkovou databázi AdventureWorks2025 nebo AdventureWorksDW2025, kterou si můžete stáhnout z domovské stránky Microsoft SQL Serveru pro ukázky a komunitní projekty .

V následujícím příkladu BEGIN definujte END sekvence logicky souvisejících Transact-SQL příkazů k provedení v pořadí. Příklad také ukazuje vnořené bloky.

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. Použijte BEGIN... END v transakci

V následujícím příkladu BEGIN definujte END řadu příkazů Transact-SQL, které se spouštějí společně. Pokud blok není zahrnut, BEGIN...END oba ROLLBACK TRANSACTION příkazy se spustí a obě PRINT zprávy se vrátí.

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. Použijte označení GOTO pro dynamicky generovaný BEGIN... KONCOVÉ bloky

Pokud generujete dynamické Transact-SQL pomocí bloku BEGIN...END a chcete, aby váš program vždy vykresloval BEGIN...END klíčová slova, můžete použít štítek GOTO jako dočasné prohlášení, abyste se vyhnuli prázdnému BEGIN...END bloku.

BEGIN
    unusedLabel:
END

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

C. Definujte řadu tvrzení, která běží společně

V následujícím příkladu a BEGIN definujte řadu příkazů SQL, END které se spouštějí společně.

Upozornění

Pokud odstraníte BEGIN klíčová slova a END , následující příklad běží v nekonečné smyčce. Příkaz WHILE se opakuje pouze dotaz SELECT a nikdy se k němu SET @Iteration += 1 nedostane.

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

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