Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro:SQL Server
Azure SQL Database
Spravovaná instance Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Koncový bod analýzy SQL v Microsoft Fabric
Sklad v Microsoft Fabric
Databá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.
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
THROWdo bloku.Použijte středník za slovy
BEGIN, abyste předešli záměně sBEGIN TRANSACTIONvýroky orBEGIN ATOMIC.Použití středníku po něm
ENDzajistí, že jakýkoli následující výrok, zejména klíčové slovoWITHneboTHROWvý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 .
A. Definujte posloupnost logicky souvisejících tvrzení v pořadí
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
Související obsah
- ALTEROVÁ SPOUŠŤ (Transact-SQL)
- Řízení toku
- VYTVOŘIT SPOUŠŤ (Transact-SQL)
- END (ZAČÁTEK... END) (Transact-SQL)