Anmerkung
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Azure SQL-Datenbank
Verwaltete Azure SQL-Instanz
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL-Analyseendpunkt in Microsoft Fabric
Lagerhaus in Microsoft Fabric
SQL-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
WITHSchlüsselwort, das einen gemeinsamen Tabellenausdruck (CTE) startet.Du brauchst ein Semikolon mit einer
THROWAussage innerhalb eines Blocks.Benutze danach ein Semikolon
BEGIN, um Verwechslungen mit denBEGIN TRANSACTIONoder-AnweisungenBEGIN ATOMICzu vermeiden.Die Verwendung eines Semikolons danach
ENDstellt sicher, dass jede nachfolgende Aussage, insbesondere ein Schlüsselwort oderTHROWeineWITHAussage, 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.
A. Definiere eine Folge logisch zusammenhängender Aussagen in der Reihenfolge
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