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

İ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.

Yeni Nesil Veri Ambarı – Microsoft SQL Server 2012 Paralel Data Warehouse

Microsoft SQL Server 2012 Parallel Data Warehouse (PDW) veri analizlerinizi hızlı bir şekilde çalıştırmak ve tek bir cihaz içerisinde depolamayı birkaç terabayttan 6 petabayt üzerine ölçeklendirebilmenize imkân sunan yeni nesil bir platformdur.

PDW, sisteminize en yüksek performansı sunmak için, önceden yapılandırılmış ve kurulmuş donanım ve yazılımla gelir. PDW sade bir tasarıma sahiptir; bu sayede hem öğrenmesi hem de yönetmesi kolaydır.

Peki böyle bir platformu neden tercih etmeliyiz, hep birlikte 10 adımda inceleyelim;

1. Ölçeklenebilir

PDW, depolamayı tek bir cihazda birkaç terabayttan 6 petabaytın üzerine çıkarabilen bir ölçeklenebilirlik sağlamaktadır. SMP (SQL Server 2008 R2, SQL Server 2012, Oracle vs) sistemlerinde daha fazla veri saklayabilmek için daha fazla sunucu almak gerekirken, PDW farklı olarak, mevcut sisteme yapılan ilavelerle büyür. PDW sistemi mevcut yapıya ‘ölçeklendirme birimi’ ekleyerek genişler.

pdw1

2. Hızlı

PDW’nin büyük ölçekli paralel işlem (MPP) tasarımı sayesinde sorgular, simetrik çoklu işlem (SMP) veri tabanı yönetim sistemleri üzerinde kurulmuş geleneksel veri ambarları ile kıyaslandığında ortalama 50 kat daha hızlı bir şekilde tamamlanmaktadır.  50 kat hız sorguların saatler yerine dakikalar hatta saniyeler içerisinde tamamlanması anlamına gelmektedir.

pdw2

Sorgular paralel yürütülmektedir. Kullanıcı verileri Hesaplama düğümleri olarak adlandırılan işlem ve depolama birimleri arasında dağıtılmıştır. Her bir Hesaplama biriminin kendine ait depo, işlemci ve belleği vardır; bunlar birlikte bağımsız bir işlemci birimi olarak çalışır. Kontrol düğümü PDW’nin beynidir ve her bir kullanıcı sorgusunun tüm Hesaplama birimleri üzerinde nasıl çalıştırılacağını belirler. Bu sayede de sorgular hızlı bir şekilde tamamlanır. Ağ iletişimde ise Yüksek Hızlı InfiniBand Ağı kullanılır.

3. Güvenilir

PDW verilerinizi güvenli ve kullanılabilir halde tutma konusunda güvenebileceğiniz bir platformdur. Tüm donanım ve yazılım bileşenleri, yüksek yedeklilik ve yüksek süreklilik için tasarlanmıştır.

4. Yüksek Süreklilik

PDW’nin donanım ve yazılım mimarisi yüksek süreklilik elde edebilmek için birlikte oluşturulmuştur. Windows Server 2012 içerisinde yer alan özellikleri kullanarak PDW her bir düğümü sanal bir ortam içerisinde çalıştırabilir. Bu yetenek sayesinde düğümler teknik olarak herhangi bir sunucu üzerinde çalışabilir. PDW, bir sunucu arıza yaptığında, sanal bir makine üzerinde çalışan düğümü ayrı bir sunucuya devretmek için Windows Failover Clustering özelliğini kullanır.

5. Kullanımı ve Yönetimi Kolay

PDW basit bir tasarıma sahiptir. PDW, verilerin tamamının cihaz düğümlerine dağıtılması için gereken tüm detayları kendisi uygular, sorguların paralel bir şekilde işlenmesi için gerekli ekstra adımları atar ve basit donanım ve yazılım yapılandırma ayarlarınızı kendiliğinden yönetir. PDW veri merkezinize önceden yapılandırılmış ve test edilmiş olarak gelir; sizin tek yapmanız gereken PDW’yi veri merkezinize takmak ve ağ iletişimi ortamınıza göre yapılandırmaktır. PDW’u veri merkezinize geldiği gün kullanmaya başlayabilirsiniz.

pdw3

Configuration Manager sayesinde kurulum kolay bir şekilde yapılabilir.

pdw4

Cihazı izleyebilmek için bir admin konsolu bulunmaktadır.

6. Hadoop ile Entegrasyon

PDW’nin PolyBase teknolojisi, T-SQL kullanarak Hadoop verilerini sorgulamanıza ve ilişkisel verilerinizle birleştirmenize imkân verir. PolyBase’in T-SQL arabirimini kullanarak Hadoop içerisinde MapReduce sorgularını zorlanmadan veri madenciliği, raporlama ve analizler gerçekleştirebilirsiniz. Örneğin sorgular Hadoop ve PDW verilerini tek bir aşamada birleştirebilirsiniz.

pdw5

7. Yüksek Sıkıştırma Oranı

PDW, verileri disk üzerinde tutmak için bellek içi kümelenmiş columnstore dizinlerini kullanarak yüksek sıkıştırma oranları elde eder. Bu sayede depolama masraflarını azaltır ve sorgu performansını iyileştirir.

8. Hızlı Veri Yükleme Kolaylığı

PDW, verilerinizi SQL Server 2012’dan 7 kat hızlı yükler. Yükleme işi PDW’de çok daha hızlıdır çünkü veri paralel olarak SQL Server’ın birden çok belleğine yüklenir.

9. Daha Fazla Veri tutma Kolaylığı

PDW’nin ölçeklendirilebilir mimarisi, kapasite eklemeyi kolaylaştırır ve bu sayede analizler ve raporlamalar için daha fazla veriyi çevrimiçi olarak tutabilirsiniz. Ayrıca SMP sistemlerinde de olduğu gibi, verilerinizi bölümlere ayırabilir ve ihtiyacınıza göre belirli bölümleri veri ambarınızda arşivleyebilirsiniz.

10. İş Zekâsı Araçlarıyla Entegrasyon

PDW’nin İş Zekâsı (BI) araçlarıyla kolay entegrasyonu PDW’yi veri madenciliği ve analiz çözümleri için kapsamlı bir platforma dönüştürmektedir. PDW, Reporting Services, Analysis Services, PowerPivot ve PowerView gibi Microsoft İş Zekâsı çözümleriyle entegre olmaktadır. PDW aynı zamanda Business Objects, Cognos, SAP Data Integrator, Tableau, MicroStrategy, QlikView, Oracle Business Intelligence ve TIBCO Spotfire gibi sayısı gittikçe artan çözümle de entegre olabilmektedir.

İ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 Integration Services ile Excel Hücrelerini Okuma

ETL ile uğraşan herkes bir şekilde SSIS ile Excelden veri okumuştur. Herhâlde en rahat ve kolay şekilde yapılan okuma türü de budur. Peki ya verimiz excelde düz bir liste şeklinde değil de farklı hücrelerde dağınık bir şekilde bulunuyorsa o zaman ne yapmamız gerekiyor? Hep birlikte bunu inceleyeceğiz şimdi.

Elimizdeki örnek excel modeli aşağıdaki şekildeki gibi olsun.excel1

Gördüğümüz gibi exceldeki veriler satır formatında değil kolon formatında bulunuyor. Ad bilgisini okuyabilmek için B3, pozisyon bilgisini okuyabilmek için H5 hücrelerini okumamız gerekiyor. Normal SSIS aktarımlarını bu örneğimiz gibi durumlarda kullanamıyoruz.

Şimdi bu exceldeki hücreleri tek tek okuyarak SQL Server’daki bir tabloya SSIS yardımıyla yazmaya başlayalım. Bu işlem için SSIS deki Script Component taskını kullanacağız.

Script tipi olarak source seçiyoruz ve çıktı olarak vereceğimiz tüm alanlarımızı tek tek tanımlıyoruz. Tüm çıktı alanları için doğru data tiplerinde tanımlama yapmamız çok önemli.

 excel3

Tanımlamalardan sonra Edit script diyerek gereken kodu yazmaya başlıyoruz. Ben burada yazacağım kod olarak Vb.Net tercih ettim, C# ile de yazılabilir.

Excelden okuma yapacağımız için öncelikle excel referansını ekliyoruz.

 excel4

Kodun en üstündeki Imports alanına Imports Microsoft.Office.Interop.Excel tanımlamasını yapıyor ve CreateNewOutputRows() içine aşağıdaki kodu yazıyoruz.

Public Overrides Sub CreateNewOutputRows()
Dim oExcel As Object = CreateObject(“Excel.Application”)
Dim FileName As String
FileName = “C:\Users\socak\Desktop\test.xls”
Dim oBook As Object = oExcel.Workbooks.Open(FileName)
Dim oSheet As Object = oBook.Worksheets(1)
Output0Buffer.AddRow()
Output0Buffer.Ad = oSheet.Range(“B3”).Value
Output0Buffer.Soyad = oSheet.Range(“B4”).Value
Output0Buffer.İl = oSheet.Range(“B5”).Value
Output0Buffer.İlçe = oSheet.Range(“E4”).Value
Output0Buffer.Firma = oSheet.Range(“E5”).Value
Output0Buffer.Pozisyon = oSheet.Range(“H5”).Value
End Sub

Paketimizi çalıştırdıktan sonra SQL Server daki tablomuza kayıtların geldiğini görebiliyoruz.

excel5

Exceldeki her bir hücrenin tek tek kodun içinde yazılıyor olması biraz can sıkıcı olabilir ama hücrelerdeki değerler sabit kabul edilirse oldukça kolay bir yöntem olarak kullanabiliriz.

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