Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analiz Platformu Sistemi (PDW)
Microsoft Fabric'teki SQL analiz uç noktası
Microsoft Fabric'teki ambar
Microsoft Fabric'teki SQL veritabanı
Mantıksal bir kod bloğuna Transact-SQL ime dizisini kaplar. Bu kullanım BEGIN ve BEGIN ATOMIC ifadeleriyle BEGIN TRANSACTION ilgisizdir.
BEGIN...END Önceden gelen bir akış kontrol ifadesi olan blokları kullanabilirsiniz, örneğin IF, ELSE, ve WHILE. Ancak, bu blokları önceden herhangi bir akış kontrol ifadesi olmadan da ifadeler dizilerini organize bir şekilde gruplamak için kullanabilirsiniz. Ancak her yeni BEGIN...END blok yeni bir sözcük kapsamı yaratmaz.
Transact-SQL söz dizimi kuralları
Syntax
BEGIN [ ; ]
{ sql_statement | statement_block }
END [ ; ]
Arguments
{ sql_statement | statement_block }
Deyim bloğu kullanılarak tanımlanan geçerli Transact-SQL deyimi veya deyim gruplandırma.
Remarks
Bir BEGIN...END blok en az bir ifade içermelidir. Boş BEGIN...END bir blok kullanmaya çalışırsanız, her anahtar kelimeden sonra nokta virgül kullansanız bile sözdizimi hatası alırsınız. Boş BEGIN...END bloklardan kaçınmak için bir GOTO etiketi yer tutucu ifadesi olarak kullanabilirsin.
Örnek C'ye Bakınız: Dinamik olarak oluşturulan BEGIN için GOTO etiketi kullanın... END blokları.
BEGIN...END bloklar iç içe yerleştirilebilir.
BEGIN...END Bloklar herhangi bir sözcük kapsamı tanımlamıyor. Bir değişkeni bir blok içinde ilan ederseniz, bu sadece ifadeyi içeren DECLARE blok içinde değil, ana grup boyunca görünürdür.
Birden fazla partide blok kullanamazsınız BEGIN...END . Örneğin, bir blok içinde toplu ayırıcıyı BEGIN...END kullanamazsınızGO.
Blok BEGIN...END ifadeleri kullanmak grup ifadelerinin atomik olarak çalıştığı anlamına gelmez. Bir toplu işlem dışında çalıştığında ve çoklu ifade BEGIN...END bloğunun ikinci ifadesi tarafından hata ortaya çıkarıldığında veya bir istisna atıldığında, ilk ifade geri alınmaz.
ve anahtar kelimelerinden sonra BEGIN nokta virgül kullanmak isteğe bağlıdır ancak önerilir, aşağıdaki durumlar dışında:END
Ortak tablo ifadesini (CTE) başlatan
WITHanahtar kelimeden önce noktalı virgül gerekir.Bir blok içinde bir
THROWnokta noktası olan noktalı virgül gerekir.Or
BEGIN ATOMICifadeleriyleBEGIN TRANSACTIONkarışıklığı önlemek için nokta virgül kullanınBEGIN.Nokta virgül kullanmak
END, sonraki herhangi bir ifadenin, özellikle anahtarWITHkelime veyaTHROWifadenin önündeki nokta virgül gerektirmemesini sağlar.
Tüm Transact-SQL ifadeleri bir BEGIN...END blok içinde geçerli olsa da, belirli Transact-SQL ifadelerini aynı grup veya ifade bloğunda bir araya getirmemelisiniz. Açıklamaların mevcut Transact-SQL parti gereksinimleriyle çakışmadığından emin olun.
Examples
Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.
A. Mantıksal olarak ilişkili ifadeler dizisini sırayla tanımlayın
Aşağıdaki örnekte BEGIN , END ve mantıksal olarak ilişkili Transact-SQL ifadelerinin sıralarını sırayla çalıştırmak için tanımlayın. Örnek ayrıca iç içe blokları da gösteriyor.
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. BEGIN kullanın... Bir işlemde END
Aşağıdaki örnekte birlikte BEGINEND yürütülen bir dizi Transact-SQL deyimi tanımlayın. Blok BEGIN...END dahil edilmediyse, her iki ROLLBACK TRANSACTION ifade de çalıştırılır ve her iki PRINT mesaj da geri döner.
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. Dinamik olarak oluşturulan BEGIN için bir GOTO etiketi kullanın... END blokları
Bir BEGIN...END blokla dinamik Transact-SQL üretiyorsanız ve programınızın anahtar kelimeleri BEGIN...END her zaman render etmesini istiyorsanız, boş BEGIN...END blok olmasını önlemek için bir GOTO etiketi yer tutucu ifade olarak kullanabilirsiniz.
BEGIN
unusedLabel:
END
Örnekler: Azure Synapse Analytics ve Analytics Platform Sistemi (PDW)
C. Birlikte çalışan bir dizi ifade tanımlayın
Aşağıdaki örnekte birlikte BEGINEND çalışan bir dizi SQL deyimi tanımlayın.
Dikkat
ve END anahtar kelimelerini BEGIN çıkarırsanız, aşağıdaki örnek sonsuz bir döngüde çalışır. Ifade WHILE yalnızca sorguyu SELECT döngüye alır ve asla ifadeye SET @Iteration += 1 ulaşmaz.
-- Uses AdventureWorksDW;
DECLARE @Iteration AS INT = 0;
WHILE @Iteration < 10
BEGIN
SELECT FirstName,
MiddleName
FROM dbo.DimCustomer
WHERE LastName = 'Adams';
SET @Iteration + = 1;
END
İlgili içerik
- ALTER TRIGGER (Transact-SQL)
- Akış Kontrolü
- TETİKLEYİCİ OLUŞTUR (Transact-SQL)
- END (BAŞLA... END) (Transact-SQL)