Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Microsoft Fabric
Omsluter en sekvens av Transact-SQL-satser till en logisk kodblock. Denna användning av BEGIN är orelaterad till BEGIN TRANSACTION och-satserna BEGIN ATOMIC .
Du kan använda BEGIN...END block med en föregående flödeskontrollsats såsom IF, ELSE, och WHILE. Du kan dock också använda dessa block utan någon föregående flödeskontroll-sats för att gruppera sekvenser av satser på ett organiserat sätt. Men varje nytt BEGIN...END block skapar inte ett nytt lexikalt omfång.
Transact-SQL syntaxkonventioner
Syntax
BEGIN [ ; ]
{ sql_statement | statement_block }
END [ ; ]
Arguments
{ sql_statement | statement_block }
Alla giltiga Transact-SQL-instruktion eller -instruktionsgruppering enligt definitionen med hjälp av ett instruktionsblock.
Remarks
Ett BEGIN...END block måste innehålla minst ett påstående. Om du försöker använda ett tomt BEGIN...END block får du ett syntaxfel, även om du använder ett semikolon efter varje nyckelord. Du kan undvika tomma BEGIN...END block genom att använda en GOTO etikett som en platshållarsats. Se exempel C: Använd en GOTO-etikett för dynamiskt genererad BEGIN... SLUTBLOCK.
BEGIN...END block kan kapslas.
BEGIN...END Block definierar ingen lexikal omfattning. Om du deklarerar en variabel inom ett block är den synlig i hela föräldrabatchen, inte bara inom blocket som innehåller DECLARE satsen.
Du kan inte använda BEGIN...END block över flera batcher. Till exempel kan du inte använda batchseparatorn GO inuti ett BEGIN...END block.
Att använda en BEGIN...END block to group-sats betyder inte att alla satser i gruppen körs atomärt. När en batch körs utanför en transaktion och ett fel uppstår eller ett undantag kastas av den andra satsen i ett multistatementblock BEGIN...END , rullas inte den första satsen tillbaka.
Semikolon efter och BEGINEND nyckelord är valfria men rekommenderas, förutom i följande fall:
Du behöver ett semikolon före nyckelordet
WITHsom startar ett gemensamt tabelluttryck (CTE).Du behöver ett semikolon med ett
THROWuttalande inom ett block.Använd ett semikolon efteråt
BEGINför att undvika förväxling med eller-satsernaBEGIN TRANSACTIONBEGIN ATOMIC.Att använda ett semikolon efter
ENDsäkerställer att varje efterföljande uttalande, särskilt ettWITHnyckelord ellerTHROWpåstående, inte behöver ett föregående semikolon.
Även om alla Transact-SQL satser är giltiga inom ett BEGIN...END block bör du inte gruppera vissa Transact-SQL satser tillsammans i samma batch eller satsblock. Se till att uttalanden inte krockar med befintliga krav på Transact-SQL batch.
Examples
Kodexemplen i den här artikeln använder AdventureWorks2025- eller AdventureWorksDW2025-exempeldatabasen, som du kan ladda ned från startsidan Microsoft SQL Server Samples och Community Projects.
A. Definiera en följd av logiskt relaterade påståenden i ordning
I följande exempel definieras BEGINEND sekvenser av logiskt relaterade Transact-SQL-satser att exekveras i ordning. Exemplet visar också nästlade block.
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. Använd BEGIN... SLUT i en transaktion
I följande exempel BEGIN och END definiera en serie Transact-SQL-instruktioner som körs tillsammans. Om blocket BEGIN...END inte inkluderas körs båda ROLLBACK TRANSACTION satserna och båda PRINT meddelandena returneras.
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. Använd en GOTO-etikett för dynamiskt genererad BEGIN... ÄNDBLOCK
Om du genererar dynamisk Transact-SQL med ett BEGIN...END block och vill att ditt program alltid ska rendera BEGIN...END nyckelorden kan du använda en GOTO etikett som en platshållarsats för att undvika att blocket är tomt BEGIN...END .
BEGIN
unusedLabel:
END
Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)
C. Definiera en serie påståenden som löper tillsammans
I följande exempel definierar BEGIN du END en serie SQL-instruktioner som körs tillsammans.
Försiktighet
Om du tar bort nyckelorden BEGIN och och END körs följande exempel i en oändlig loop. Satsen WHILE loopar endast SELECT frågan och når aldrig uttalandet 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