SQL Server’da Karar İfadeleri ve Döngü Kullanımı

T-SQL komutlarında bazen bir ifadeyi bir koşula dayandırarak çalıştırma ihtiyacı duyabiliriz. Bu durumlarda karar ifadeleri ve döngüler yardımımıza koşar. Karar ifadeleri ve döngüler yardımıyla belli bir ifadeyi belli bir sayıda veya belli bir koşul gerçekleşinceye kadar çalıştırabiliriz. Peki bunlar nelerdir, kısaca inceleyelim.

IF-ELSE

Karar ifadelerinin en basiti ve en çok kullanılanıdır. IF komutunu izleyen boolean ifade TRUE olursa takip eden ifadeler, FALSE olursa ELSE komutundan sonra gelen ifadeleri gerçekleştirecektir. IF kullanımında iç içe IF blokları da kullanabiliriz.

Bir örnekle inceleyelim.

dongu1

IF EXISTS

Bu komut ile de bir kaydın var olup olmadığını sorgularız. Daha çok database’de bir objenin var olup olmadığını sorgulamak istediğimiz zaman kullandığımız bir komuttur.

dongu2

CASE

Birden çok boolean deyimlerini karşılaştırmalı olarak tek bir ifade içinde belirtmemize olanak tanır. Select, update gibi ifadeler ile birlikte kullanılır. CASE ifadesi komut değil bir işlev olduğu için IF komutunda olduğu gibi tek başına kullanılmaz.

dongu3

WHILE

C# da yazılım yaparken kullanılan Foreach döngüsünün SQL Server’daki karşılığı WHILE döngüsü diyebiliriz. İfadelerin belli bir koşul gerçekleşinceye kadar çalışmasını sağlar. Döngü ancak ilgili koşulun TRUE veya FALSE olması ile birlikte durdurulabilir. Eğer şart belirlenmeden bir WHILE döngüsü oluşturulursa döngü sonsuz döngü olur.

IF kullanımında iç içe IF blokları kullanabildiğimiz gibi, WHILE döngüsü içinde de bir WHILE döngüsü oluşturabiliriz. Bunu yapabildiğimiz gibi WHILE döngüsü içinde de IF blokları oluşturabilir ya da tam tersi IF blokları içinde de WHILE döngüleri oluşturabiliriz.

İlk örneğimizde 1’den 10’a kadar sayıları WHILE döngüsü ile ekrana yazdıralım.

dongu4

Diğer örneğimizde ise WHILE döngüsü ile ürün kod değeri çift sayi olan ürünlerin ad, ürün kodu ve renk bilgilerini ekrana yazdıralım.

dongu5

CURSOR KULLANIMI

SQL Server’da bir sorgu sonucu dönen kayıtlar üzerinde satır bazlı işlem yapmak için CURSOR kullanırız. CURSOR hangi satır üzerinde ise o satırda bulunan veriler ile işlem yapılır. CURSOR kullandığımız Select cümlesinde dönen her kayıt bir değişkene atanmalıdır. Select cümlesinden hangi veri tipinde ne kadar kayıt dönecek ise o kayıt sayısı kadar aynı veri tiplerinde değişkenler tanımlanır.

CURSOR kayıtlar üzerinde dolaşmaya başlamadan önce Open komutu ile açılır, Fetch Next komutu ile kayıtlar üzerinde ilerlenir, kayıtlar ile ilgili işlemler bittikten sonra ise Close komutu ile kapatılır.
Bir örnek ile inceleyelim.

Örneğimizde DimGeography tablosundan aldığımız key alanı ile DimCustomer
tablosu üzerinde sorgu çalıştırıyoruz ve o key alanına ait olan bölgelerdeki müşteri sayısını alıp Customer_Count tablomuza ekliyoruz.

dongu6

Reklamlar

İPUCU – T-SQL de Truncate ile Delete Komutu Arasındaki Farklar

T-SQL de sorgu yazarken bazı verileri silmek istediğimiz zaman hepimizin bildiği gibi Delete komutunu kullanırız. Tüm kayıtları silmek istediğimiz de ise hem Delete hem de Truncate komutlarını kullanabiliriz. Peki bu komutlar arasındaki farklar nelerdir? Temel farkları kısaca inceleyelim;

1. Delete komutunu kullanırken sorgumuza where şartını ekleyebiliriz. Truncate komutunda böyle bir imkân yoktur, tüm kayıtları siler.
delete1
2. En önemli fark olarak eğer tablomuzda identity kolonumuz varsa, Delete yaparsak o kolon kaçıncı identity de kalmışsa kaldığı yerden saymaya devam eder. Truncate Table yaptığımız zaman ise en baştan saymaya başlar.

3. Tablonun üzerinde Delete Trigger’ı varsa, Truncate Table yaptığımızda tetiklenmez. Delete komutu ile trigger tetiklenir.

4. Foreign Key içeren tablolarda Truncate Table yapılmaz. Delete komutu kullanılmalıdır.

5. Truncate komutunda loglama kayıt bazlı yapılmadığı için Delete komutuna göre daha performanslıdır.

İPUCU – VIEW’larda ORDER BY Kullanımı

T-SQL ile uğraşan herkes mutlaka view’larla da uğraşmıştır. View’lar tablolardaki verilere erişmek için kullandığımız bir diğer yoldur. İçlerinde genellikle select deyimiyle oluşturulmuş bir sorgu bulunur. Gerçekte view’larda order by terimi kullanılmaz. Peki bir view oluşturdunuz ve bu view içinde ORDER BY ifadesi kullanmak istiyorsunuz. Nasıl olacak bu iş?
View’larda ORDER BY kullanmanın tek yolu TOP 100 PERCENT ifadesini kullanmaktır.
TOP 100 PERCENT komutu view’daki kayıtların 100% ünü sıralı bir şekilde getirecektir.

Bir örnekle açıklayalım.
AdventureWorksDW2012 dbmizdeki vAssocSeqLineItems view’ına order by yazıp alter etmek istediğimde aşağıdaki hatayı alıyorum.

view1


Aynı view’u Top 100 percent ekleyerek alter ettiğimde ise komut başarılı bir şekilde çalışıyor.

view2


View’umuz başarılı bir şekilde güncellendi ve verimiz OrderNumber değişkenine göre sıralı bir şekilde listelendi.

view3

Ek olarak Order By eklendikten sonra view’daki sorgu performansının düştüğünü de unutmayalım.

SQL Server 2012 ile Hayatımızı Kolaylaştıran Fonksiyonlar-2

Bu yazımızda bir önceki yazımızda başladığımız SQL Server 2012’nin gelmesiyle birlikte hayatımıza giriş yapan T-SQL fonksiyonlarına devam ediyoruz.

TRY_PARSE Fonksiyonu

PARSE fonksiyonundan farklı olarak, dönüştürme işleminde başarılı olamazsa NULL döndürür. PARSE fonksiyonunun, başarılı olamazsa bir hata mesajı ile programın çalışmasını sonlandırmasını istemediğimiz durumlarda, TRY_PARSE fonksiyonu kullanabiliriz.

Kullanımı Parse fonksiyonu ile aynıdır.

Örnek

sqlfonk2_1


Format Fonksiyonu

.NET ortamındaki bütün String formatlama işlevlerinin SQL Server ortamında geliştirilmesini sağlayan bir fonksiyondur. Kolaylık ve pratikliğine bakıldığında sonraki sürümlerde veri tabanı programcıları için CAST ve CONVERT fonksiyonlarının yerini alması muhtemel gibi görüyor.

FORMAT(sutunAd, format [kultur])

Örnek

 sqlfonk2_2


EOMONTH() Fonksiyonu
Ayın son gününü bulan fonksiyondur.
Örnek

sqlfonk2_3


FIRST_VALUE ve LAST_VALUE Fonksiyonları
Sorgudaki belirlenen kritere göre ilk değeri ve son değeri bulan fonksiyonlardır.
FIRST_VALUE ( [scalar_expression ) OVER ( [ partition_by_clause ] order_by_clause [ rows_range_clause ] )
Örnek

sqlfonk2_4


Lead ve Lag Fonksiyonları

Yazılan sorgudaki değerin bir önceki ve bir sonraki değerlerini aynı satırda yan yana yazabilmemizi sağlayan fonksiyonlardır.

Örnek

 sqlfonk2_6

Sonuç olarak yenilik olarak karşımıza gelen bu fonksiyonlarla birçok satır kod yazma yükünden kurtularak hızlı ve kolay bir şekilde sorgularımızı yazabiliyoruz.

SQL Server 2012 ile Hayatımızı Kolaylaştıran Fonksiyonlar-1

SQL Server 2012’nin gelmesiyle birlikte birçok T-SQL fonksiyonu da hayatımızı girdi. Olmazsa olmaz değil ama bu fonksiyonlar olmadan takla atarak çözebileceğimiz komutları tek satır ile çözmemize yarayan komutlar bunlar aslında. Nasıl mı, bazılarını inceleyip görelim.

Concat Foksiyonu

Concat fonksiyonu string ifadeleri uç uca eklemeye yarar. Özellikle hepimizin sıkıntı yaşayabileceği boşluk değerinin eklenmesinde kolaylık getirmiştir. Aradaki bir string ifade de boşluk değeri varsa o değeri bir boşluk olarak ekler, tüm sonucu boş olarak döndürmez.
CONCAT(sutun1,sutun2,[sutun3, ……, sutunN])

Örnek

sqlfonk1


IIF Fonksiyonu

IIF fonskiyonu belirtilen Boolean bir koşulun sonucuna göre geriye değer döndüren fonksiyondur. Case yapısının kısa hali diyebiliriz.
IIF([Boolean Koşul],[Doğru Değer],[Yanlış Değer])

Örnek

sqlfonk2


Choose Fonksiyonu

Choose fonksiyonu parametre olarak gönderilen iki ya da daha fazla değer içerisinden belirtilen indexteki değerin geri döndürülmesini sağlar.

CHOOSE ( index, değer, val_2 [, val_n ] )

Örnek

sqlfonk3


Parse Fonskiyonu

Parse fonksiyonu, CAST ve CONVERT fonksiyonlarından farklı olarak sadece metin tutan verileri girdi olarak kabul eder ve bir metni tarih zaman veya tam sayı tiplerine dönüştürmek için kullanılır. Para birimi gibi ek göstergeler için kültür kodu parametre olarak verilebilir. Türkiye için kültür kodu “tr-TR” dir.

PARSE (string_sutun_ismi AS hedef_tip [USING xx-XX])

Örnek

sqlfonk5


Try_Convert Fonksiyonu

Bir veri tipinden diğerine döndürmek için kullanılır. Şayet dönüştürme işlemi başarılı ise dönüştürülmüş değeri verir. Başarısız ise veya ilk değer NULL ise NULL değeri döndürür. 
TRY_CONVERT (veritipi[(uzunluk)], sutun_ismi)

Örnek

sqlfonk6

İPUCU – T-SQL de Object Var Mı Sorusunun Cevabı

SQL de sorgular üzerinde çalışırken hepimizin db. üzerinde mutlaka aradığı ama bir türlü bulamadığı tablo, view vs objeler oluyordur. Böyle bir durumda Object Explorer üzerinden keşif yapmak yerine aşağıdaki sorgu yardımıyla istediğimiz obje db üzerinde var mı kolaylıkla öğrenmiş oluyoruz.

Ayrıca herhangi bir objenin hangi stored procedure lerde geçtiğini bulabilmek için de OBJECTEXPLORER özelliğini kullanabiliriz.

objevarmi1

İPUCU – Pivot Şeklinde Gelen Sorguyu Unpivot Hale Dönüştürme

Pivot fonksiyonu SQL Server 2005 ile birlikte hayatımıza giren bir fonksiyondur. Özellikle raporlamalarda çapraz sorgular çıkarmamız gerekebilir. Bu işlemi bazı raporlama araçlarıyla kolaylıkla yapabiliriz. Peki ya T-SQL de nasıl olacak? T-SQL ile yapabilmemiz için ise doğru adres pivot- unpivot fonksiyonlarıdır.

Bir örnek ile açıklayalım.

Elimizde ürünlerin senelere göre adet bilgisini tutan aşağıdaki tablo olsun.

unpivot1

Şimdi bu tabloyu unpivot hale getirelim.

unpivot2

Görüldüğü üzere çok basit bir fonksiyonla tablolarımızı unpivot hale getirebiliyoruz. Bu fonksiyon çok fazla kullanılmasa da özellikle büyük ve karmaşık tablolarda çoğu zaman hayat kurtarıcı olabiliyor.