Program akışını denetlemek için EĞER ve WHILE bloklarını kullanma
Tüm programlama dilleri, programın akışını veya deyimlerin yürütüleceği sırayı belirlemenize yardımcı olan öğeler içerir. C# gibi tam özellikli olmayan T-SQL, mantıksal testler gerçekleştirmek ve T-SQL veri işleme deyimlerinizi içeren döngüler oluşturmak için kullanabileceğiniz bir dizi akış denetimi anahtar sözcüğü sağlar. Bu derste, T-SQL EĞER ve WHILE anahtar sözcüklerini kullanmayı öğreneceksiniz.
Akış dilinin T-SQL denetimini anlama
SQL Server, T-SQL toplu işlemleri, saklı yordamlar ve çok durumlu kullanıcı tanımlı işlevler içinde program yürütme akışını denetleyebilen dil öğeleri sağlar. Bu akış denetimi öğeleri, deyimlerin yürütülip yürütülmeyeceğini program aracılığıyla belirleyebileceğiniz ve yürütülmesi gereken bu deyimlerin sırasını program aracılığıyla belirleyebileceğiniz anlamına gelir.
Bu öğeler şunlardır ancak bunlarla sınırlı değildir:
- EĞER... ELSE, boole ifadesini temel alan kodu yürütür.
- WHILE, bir koşul doğru olduğu sürece çalışan bir döngü oluşturur.
- BAŞLA... BİTİR, birlikte yürütülmesi gereken bir dizi T-SQL deyimini tanımlar.
- T-SQL akış denetimi işlemlerini desteklemek için kullanılan BREAK, CONTINUE, WAITFOR ve RETURN gibi diğer anahtar sözcükler.
IF deyiminin bir örneği aşağıda verilmiştir:
IF OBJECT_ID('dbo.tl') IS NOT NULL
DROP TABLE dbo.tl
GO
Programlarınızda koşullu mantık kullanmak için EĞER...BAŞKA deyimlerini kullanın.
EĞER... ELSE yapısı, T-SQL'de koşula göre bir kod bloğunu koşullu olarak yürütmek için kullanılır. IF deyimi, aşağıdaki deyimin veya bloğun (BEGIN...END kullanılıyorsa) yürütülüp yürütülmeyeceğini belirler. Koşul TRUE olarak değerlendirilirse, bloktaki kod yürütülür. Koşul FALSE veya UNKNOWN olarak değerlendirildiğinde, isteğe bağlı ELSE anahtar sözcüğü başka bir kod bloğunu tanımlamak için kullanılmadığı sürece blok yürütülmez.
Aşağıdaki IF deyiminde, veritabanına OBJECT_ID NULL olup olmadığını soruyoruz ve öyleyse PRINT deyimini döndüreceğiz. Bu örnekte nesne DEĞİL null ve bu nedenle FALSE değeridir; bu nedenle BEGIN/END kodu çalıştırılmayacaktır. PRINT deyimi yalnızca nesne veritabanında yoksa yürütülür.
USE TSQL;
GO
IF OBJECT_ID('HR.Employees') IS NULL --this object does exist in the sample database
BEGIN
PRINT 'The specified object does not exist';
END;
Yukarıdaki kodun yalnızca IF deyimiyle sınırlamaları nedeniyle bu kafa karıştırıcı olabilir. EĞER ve ELSE'yi birleştirmek, kodunuzdaki mantıkla daha fazla esneklik sağlar ve birden çok ELSE deyimi kullanabilirsiniz. ELSE kullanıldığında, aşağıdaki örnekte olduğu gibi EĞER koşulu YANLIŞ veya BİlİNMİYOR olarak değerlendirildiğinde başka bir yürütme seçeneğiniz vardır:
IF OBJECT_ID('HR.Employees') IS NULL --this object does exist in the sample database
BEGIN
PRINT 'The specified object does not exist';
END
ELSE
BEGIN
PRINT 'The specified object exists';
END;
Veri işleme işlemleri içinde, AŞAĞıDAKI örnekte olduğu gibi EXISTS anahtar sözcüğüyle IF kullanmak verimli varlık denetimleri için yararlı bir araç olabilir:
IF EXISTS (SELECT * FROM Sales.EmpOrders WHERE empid =5)
BEGIN
PRINT 'Employee has associated orders';
END;
WHILE deyimlerini kullanarak döngüleri anlama
WHILE deyimi, bir koşula dayalı bir döngüde kod yürütmek için kullanılır. IF deyimi gibi, WHILE deyimi de bir sonraki deyimin ya da bloğun (BEGIN...END kullanılıyorsa) yürütülüp yürütülmeyeceğini belirler. Koşul TRUE olarak değerlendirdiği sürece döngü yürütülmeye devam eder. Genellikle, koşul tarafından test edilen ve döngünün gövdesinde manipüle edilen bir değişkenle döngünün denetiminde olursunuz.
Aşağıdaki örnek, @empid değişkenini koşulda kullanır ve BEGIN...END bloğu içindeki değerini değiştirir.
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;
WHILE döngüsündeki ek seçenekler için, akışı denetlemek için CONTINUE ve BREAK anahtar sözcüklerini kullanabilirsiniz.