Teilen über


ANFANGEN... ENDE (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankVerwaltete Azure SQL-InstanzAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL-Analyseendpunkt in Microsoft FabricLagerhaus in Microsoft FabricSQL-Datenbank in Microsoft Fabric

Schließt eine Folge von Transact-SQL Anweisungen in einen logischen Codeblock ein. Diese Verwendung von BEGIN steht in keinem Zusammenhang mit den BEGIN TRANSACTION und-Aussagen BEGIN ATOMIC .

Sie können Blöcke mit einer vorangehenden Flow-Control-Anweisung IFwie , ELSE, und WHILEverwendenBEGIN...END. Man kann diese Blöcke jedoch auch ohne vorherige Flow-Control-Anweisungen verwenden, um Sequenzen von Anweisungen organisiert zu gruppieren. Allerdings schafft jeder neue BEGIN...END Block keinen neuen lexikalischen Umfang.

Transact-SQL-Syntaxkonventionen

Syntax

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

Arguments

{ sql_statement | statement_block}

Jede gültige Transact-SQL-Anweisung oder -Anweisung, die mithilfe eines Anweisungsblocks definiert ist.

Remarks

Ein Block BEGIN...END muss mindestens eine Anweisung enthalten. Wenn du versuchst, einen leeren BEGIN...END Block zu verwenden, bekommst du einen Syntaxfehler, selbst wenn du nach jedem Schlüsselwort ein Semikolon verwendest. Du kannst leere BEGIN...END Blöcke vermeiden, indem du ein GOTO Label als Platzhalter-Statement verwendest. Siehe Beispiel C: Verwenden Sie ein GOTO-Label für dynamisch generierte BEGIN... END-Blocks.

BEGIN...END Blöcke können geschachtelt werden.

BEGIN...END Blöcke definieren keinen lexikalischen Bereich. Wenn du eine Variable innerhalb eines Blocks deklarierst, ist sie im gesamten Eltern-Batch sichtbar, nicht nur im Block mit der Anweisung DECLARE .

Man kann keine Blöcke über mehrere Chargen hinweg verwenden BEGIN...END . Zum Beispiel kann man den GO Batch-Separator nicht innerhalb eines Blocks BEGIN...END verwenden.

Die Verwendung einer BEGIN...END Block-to-Group-Anweisungen bedeutet nicht, dass alle Anweisungen in der Gruppe atomar ausgeführt werden. Wenn ein Batch außerhalb einer Transaktion ausgeführt wird und ein Fehler ausgelöst wird oder eine Ausnahme durch die zweite Ausweisung eines Multistatement-Blocks BEGIN...END ausgelöst wird, wird die erste Anweisung nicht zurückgesetzt.

Semikolons nach den BEGIN und END Schlüsselwörtern sind optional, aber empfohlen, außer in folgenden Fällen:

  • Du brauchst ein Semikolon vor dem WITH Schlüsselwort, das einen gemeinsamen Tabellenausdruck (CTE) startet.

  • Du brauchst ein Semikolon mit einer THROW Aussage innerhalb eines Blocks.

  • Benutze danach ein Semikolon BEGIN , um Verwechslungen mit den BEGIN TRANSACTION oder-Anweisungen BEGIN ATOMIC zu vermeiden.

  • Die Verwendung eines Semikolons danach END stellt sicher, dass jede nachfolgende Aussage, insbesondere ein Schlüsselwort oder THROW eine WITH Aussage, kein vorangehendes Semikolon benötigt.

Obwohl alle Transact-SQL-Anweisungen innerhalb eines Blocks BEGIN...END gültig sind, sollten Sie bestimmte Transact-SQL-Anweisungen nicht im selben Batch oder Statement-Block gruppieren. Stellen Sie sicher, dass Aussagen nicht mit bestehenden Transact-SQL Batch-Anforderungen kollidieren.

Examples

Die Codebeispiele in diesem Artikel verwenden die AdventureWorks2025- oder AdventureWorksDW2025 Beispieldatenbank, die Sie von der Microsoft SQL Server Samples and Community Projects Homepage herunterladen können.

Im folgenden Beispiel definieren und END Folgen logisch zusammenhängender Transact-SQL-Anweisungen, BEGIN die in der richtigen Reihenfolge ausgeführt werden. Das Beispiel zeigt außerdem verschachtelte Blöcke.

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. Benutze BEGIN... END in einer Transaktion

Im folgenden Beispiel wird durch BEGIN und END eine Reihe von Transact-SQL-Anweisungen definiert, die gemeinsam ausgeführt werden. Wenn der Block BEGIN...END nicht enthalten ist, werden beide ROLLBACK TRANSACTION Anweisungen ausgeführt und beide PRINT Nachrichten werden zurückgegeben.

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. Verwenden Sie ein GOTO-Label für dynamisch generierte BEGIN... END-Blöcke

Wenn du dynamische Transact-SQL mit einem BEGIN...END Block generierst und möchtest, dass dein Programm die BEGIN...END Schlüsselwörter immer rendert, kannst du ein GOTO Label als Platzhalter-Statement verwenden, um einen leeren BEGIN...END Block zu vermeiden.

BEGIN
    unusedLabel:
END

Beispiele: Azure Synapse Analytics und Analytics-Plattformsystem (PDW)

C. Definiere eine Reihe von Aussagen, die zusammenlaufen

Im folgenden Beispiel wird durch BEGIN und END eine Reihe von SQL-Anweisungen definiert, die gemeinsam ausgeführt werden.

Vorsicht

Wenn Sie die BEGIN Schlüsselwörter und END entfernen, läuft das folgende Beispiel in einer Endlosschleife. Die WHILE Anweisung läuft nur die SELECT Abfrage in Schleife und erreicht die Anweisung SET @Iteration += 1 nie.

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

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