T-SQL, Microsoft SQL Server’ın kalbinde yer alır ve temel veri manipülasyonunun ötesine geçer. Gelişmiş T-SQL yapılarını anlamak, yalnızca büyük veri kümelerini yönetmek için değil, aynı zamanda uygulama performansını ve kodun sürdürülebilirliğini artırmak için kritik öneme sahiptir. Bu yapılar, veritabanı işlemlerini modüler hale getirerek ve karmaşık mantığı optimize ederek veri yönetimi süreçlerini yeni bir seviyeye taşır. Başarılı bir veritabanı mimarı veya geliştiricisi olmak, bu derinlemesine araç setine hakim olmayı gerektirir.

Modülerlik ve Optimizasyon: Saklı Yordamlar ve Kullanıcı Tanımlı Fonksiyonlar

Gelişmiş T-SQL programlamanın ilk adımı, tekrarlanan görevleri ve iş mantığını kapsüllemek için kullanılan modüler yapılardır. Saklı Yordamlar (Stored Procedures – SP) ve Kullanıcı Tanımlı Fonksiyonlar (User-Defined Functions – UDF), bu modülerliğin temelini oluşturur.

Saklı Yordamlar (Stored Procedures)

SP’ler, bir veya daha fazla SQL ifadesini bir araya getiren önceden derlenmiş kod bloklarıdır. Gelişmiş sistemlerde SP kullanımı, sadece kodun yeniden kullanılabilirliğini artırmakla kalmaz, aynı zamanda önemli performans avantajları sunar. SQL Server, bir SP ilk kez çalıştırıldığında bir yürütme planı (execution plan) oluşturur ve bunu önbelleğe alır. Bu, sonraki çalıştırmalarda derleme maliyetini ortadan kaldırır. Ayrıca, SP’ler genellikle parametre enjeksiyonu gibi güvenlik açıklarına karşı daha dayanıklıdır.


    CREATE PROCEDURE sp_MusteriSiparisOzeti 
        @MusteriID INT
    AS
    BEGIN
        SELECT 
            T1.SiparisID, 
            T1.SiparisTarihi, 
            SUM(T2.Miktar * T2.BirimFiyat) AS ToplamTutar
        FROM 
            Siparisler T1
        INNER JOIN 
            SiparisDetay T2 ON T1.SiparisID = T2.SiparisID
        WHERE 
            T1.MusteriID = @MusteriID
        GROUP BY 
            T1.SiparisID, T1.SiparisTarihi;
    END
    

Kullanıcı Tanımlı Fonksiyonlar (UDF)

UDF’ler, SP’lere benzer ancak bir değer (skaler fonksiyon) veya tablo (tablo değerli fonksiyon) döndürmek zorundadır. Gelişmiş programlamada, tablo değerli fonksiyonlar (özellikle inline olanlar), karmaşık bir sorguyu daha yönetilebilir parçalara ayırmak ve hatta sanal görünümler oluşturmak için kullanılır. Ancak, skaler UDF’lerin aşırı kullanımı, satır bazlı çalıştığı için performans sorunlarına yol açabilir (Sıkça karşılaşılan “RBAR – Row By Agonizing Row” sorunu).

Karmaşık Sorguları Yönetme: Common Table Expressions (CTE)

CTE’ler (Ortak Tablo İfadeleri), tek bir sorgunun yürütülme süresi boyunca tanımlanan geçici, adlandırılmış sonuç kümeleridir. CTE’ler, karmaşık sorguları basitleştirmek, kodun okunaklığını artırmak ve özellikle hiyerarşik veya özyinelemeli (recursive) veri yapılarını işlemek için vazgeçilmezdir. Geçici tablo (temp table) veya alt sorgu kullanımına göre daha zarif bir çözüm sunar.

Özyinelemeli CTE’ler (Recursive CTE)

Bir CTE’nin gelişmiş kullanım alanı, özyineleme yeteneğidir. Bu, organizasyon şemaları, malzeme listeleri (BOM – Bill of Materials) veya kategori ağaçları gibi hiyerarşik verilerin tek bir sorgu ile derinlemesine taranmasına olanak tanır. Özyinelemeli CTE’ler iki bölümden oluşur: bir başlangıç (Anchor) sorgusu ve başlangıç sonucuna başvuran bir özyinelemeli (Recursive) sorgu.


    WITH HiyerarsiCTE AS
    (
        -- Anchor Bölüm: En üst seviye çalışan (Root)
        SELECT CalisanID, YoneticiID, Ad, 0 AS Seviye
        FROM Calisanlar
        WHERE YoneticiID IS NULL

        UNION ALL

        -- Recursive Bölüm: Bir alt seviyeyi çekme
        SELECT C.CalisanID, C.YoneticiID, C.Ad, H.Seviye + 1
        FROM Calisanlar C
        INNER JOIN HiyerarsiCTE H ON C.YoneticiID = H.CalisanID
    )
    SELECT * FROM HiyerarsiCTE;
    

Veri Analizi ve Sıralama: Pencere Fonksiyonları

Pencere Fonksiyonları (Window Functions), T-SQL’in en güçlü analitik araçlarından biridir. Geleneksel `GROUP BY` yapısının aksine, pencere fonksiyonları gruplama yaparken satır detaylarını kaybetmez. Bir “pencere” veya mantıksal bölüm tanımlayarak, bu penceredeki tüm satırlar üzerinde bir toplama veya sıralama işlemi gerçekleştirir.

Anahtar yapı, pencereyi tanımlayan `OVER()` ifadesidir. Pencere Fonksiyonları üç temel amaca hizmet eder:

  • Sıralama Fonksiyonları: `ROW_NUMBER()`, `RANK()`, `DENSE_RANK()`. Bunlar, belirli bir bölüm içindeki satırları sıralamak için kullanılır.
  • Analitik Fonksiyonlar: `LAG()`, `LEAD()`. Cari satırdan önceki veya sonraki satırların verisine erişim sağlar (örneğin, aylık satış farklarını hesaplamak için idealdir).
  • Toplama Fonksiyonları: `SUM()`, `AVG()`, `COUNT()` gibi fonksiyonları `OVER()` ile kullanarak hareketli ortalamalar veya kümülatif toplamlar hesaplanır.

Örnek: Hareketli Ortalama Hesaplama


    SELECT 
        SatisTarihi,
        AylikSatis,
        AVG(AylikSatis) OVER (
            ORDER BY SatisTarihi
            ROWS BETWEEN 2 PRECEDING AND CURRENT ROW
        ) AS SonUcAyOrtalamasi
    FROM Satislar
    ORDER BY SatisTarihi;
    

Sağlamlık ve Kontrol Akışı: İşlem Yönetimi ve Hata Yakalama

Gelişmiş T-SQL, yalnızca veri sorgulamakla kalmaz, aynı zamanda verinin bütünlüğünü de korur. Kurumsal düzeyde uygulamalarda, birden fazla veri manipülasyonu işleminin tek bir atomik birim olarak ele alınması hayati önem taşır.

İşlem (Transaction) Yönetimi

İşlemler (`BEGIN TRANSACTION`), bir dizi DML (Data Manipulation Language) ifadesinin ya tamamen başarılı olmasını (`COMMIT`) ya da bir hata durumunda tüm değişikliklerin geri alınmasını (`ROLLBACK`) sağlar. Bu, özellikle mali veya envanter hareketleri gibi kritik iş akışlarında veri tutarlılığını garanti eder.

TRY…CATCH Blokları

Modern T-SQL, program akışını yönetmek ve çalışma zamanı hatalarını zarif bir şekilde ele almak için `TRY…CATCH` bloklarını kullanır. Gelişmiş SP’lerde, kritik bir işlem bloğunun `TRY` içine alınması ve herhangi bir hata durumunda `CATCH` bloğu içinde gerekli geri alma işlemlerinin (`ROLLBACK`) gerçekleştirilmesi, veritabanı bütünlüğünün bozulmasını engeller.


    BEGIN TRY
        BEGIN TRANSACTION
            -- Kritik veri güncelleme işlemleri
            UPDATE Stok SET Miktar = Miktar - 10 WHERE UrunID = 1;
            INSERT INTO Log (Islem) VALUES ('Stok Guncellendi');
        COMMIT TRANSACTION
    END TRY
    BEGIN CATCH
        IF @@TRANCOUNT > 0
            ROLLBACK TRANSACTION -- Hata durumunda tüm değişiklikleri geri al
        
        -- Hata bilgisini kaydetme veya kullanıcıya döndürme
        THROW; 
    END CATCH
    

Gelişmiş T-SQL yapıları, basit veri sorgulama görevlerinden, kurumsal düzeyde veri işleme sistemlerine geçişin temelini oluşturur. Stored Procedure’ler, CTE’ler, Pencere Fonksiyonları ve sağlam işlem yönetimi araçları sayesinde, geliştiriciler optimize edilmiş, güvenli ve kolayca bakımı yapılabilen çözümler üretebilir. Bu yeteneklere hakim olmak, SQL Server performansını maksimize etmenin ve modern veritabanı mimarisinin gerekliliklerini karşılamanın anahtarıdır. T-SQL derinliğini keşfetmek, veritabanı profesyonellerinin kariyerinde önemli bir fark yaratacaktır.