Tüm programlama dillerinde program akışını ve programlama ifadelerinin çalışma sırasını belirlemeye yardımcı olan elemanlar bulunur. T-SQL’de C# kadar olmasa da mantıksal test işlemleri, verileri işlemek ve döngüler için kullanılan bir takım akış kontrol anahtar sözcükleri bulunmaktadır. Bu bölümde T-SQL’de IF ve WHILE ifadelerinin nasıl kullanıldığını göreceğiz.

T-SQL Akış Kontrolünü Anlamak

SQL Server’da batch, sp’ler ve kullanıcı tanımlı fonksiyonlar içerisinde program akışını denetleyen dil ögeleri yer alır. Bu denetim ögeleri, hangi ifadelerin çalıştırılacağını programlı olarak belirleyen ve yürütülmesi gereken ifadelerin sırasını belirleyebileceğiniz mekanizma sağlamaktadır.

Bu denetim elemanlarından bazıları şunlardır:

  • IF … ELSE, boolean ifadesine göre kodu çalıştırır.
  • WHILE, koşullu çalıştırılan bir döngü oluşturur.
  • Birlikte yürütülmesi ifadeler BEGIN… END arasına tanımlanır.
  • Ve diğer anahtar kelimeler… (BREAK, CONTINUE, WAITFOR ve RETURN).

IF… ELSE

IF … ELSE yapısı, bir kod bloğunu koşullu olarak yürütmek için kullanılır. IF ifadesi, önündeki ifadenin veya bloğun (BEGIN … END bloğu) yürütülüp yürütülmeyeceğini belirler. Sağlanan şart TRUE ise, bloktaki kod yürütülür. FALSE veya UNKNOWN ise, eğer tanımlandıysa ELSE anahtar sözcüğüyle başka bir kod bloğu yürütülür, tanımlanmadıysa yürütme durdurulur.

Örneğin aşağıdaki IF deyimi, şart TRUE ise nesnenin var olduğu kanısına varılır ve BEGIN … END arasındaki ifadeler yürütülür. FALSE veya UNKNOWN olursa, hiçbir işlem yapılmaz ve END ifadesinin ardından çalışmaya sonra devam eder:

USE TSQL;
GO
IF OBJECT_ID('HR.Employees') IS NULL --Gerçekte veri tabanında bu nesne yok
BEGIN
 PRINT 'The specified object does not exist';
END; 

IF şartı FALSE veya UNKNOWN olursa ELSE ile elimizde çalıştırabileceğimiz başka bir seçenek olmuş olur:

IF OBJECT_ID('HR.Employees') IS NULL
BEGIN
 PRINT 'The specified object does not exist';
END
ELSE
BEGIN
 PRINT 'The specified object exists';
END; 

Verileri işlerken IF deyimini EXISTS ile kullanmak, aşağıdaki örnekte olduğu gibi denetim işlemlerinde yararlı bir araç olabilir:

IF EXISTS (SELECT * FROM Sales.EmpOrders WHERE empid =5)
 BEGIN
 PRINT 'Employee has associated orders';
 END; 

WHILE Döngüsü

WHILE ifadesi, sağlanan şartı temel alan bir döngüde kod yürütmek için kullanılır. IF ifadesi gibi WHILE ifadesi de sonraki ifadenin veya bloğun (BEGIN … END bloğu) yürütülüp yürütülmeyeceğini belirler. Şart FALSE veya UNKNOWN olarak değerlendirildiğinde döngü sona erer. Döngü, şart ifadesiyle ve döngünün gövdesinde kullanılan değişkenle kontrol edilir.

Aşağıdaki örnekte döngü kontrolü @empid ile sağlanmaktadır ve BEGIN … END arasında değeri değiştirilmektedir:

DECLARE @empid AS INT = 1, @lname AS NVARCHAR(20);
WHILE @empid <=5
 BEGIN
 SELECT @lname = lastname FROM HR.Employees
 WHERE empid = @empid;
 PRINT @lname;
 SET @empid += 1;
 END; 

Not: SELECT ifadesinden UNKNOWN dönerse, değişken geçerli değerini korur. @empid değerine yeni değer atanmaz ise, değişken değeri iterasyon sonunda değişmeyecektir. Bu durum da sonsuz döngüye yol açacaktır.

Sonuç:

Davis
Funk
Lew
Peled
Buck 

Son olarak, WHILE döngüsünde akışı denetlemek için CONTINUE ve BREAK anahtar sözcükleri de kullanılabilir.

Kaynak:
Control-of-Flow Language (Transact-SQL)
IF…ELSE (Transact-SQL)
WHILE (Transact-SQL)