System Functions etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
System Functions etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

29 Nisan 2012 Pazar

MS SQL 'de String Functions

Merhaba arkadaşlar.
Sql server 'da verileri listelemek için şimdiye kadar "select" ifadesi kullandık. Bunları bazen "view" bazen de "function" lar ile gerçekleştirdik. İhtiyacımıza göre kendi view yada fonksiyonumuzu oluşturmaktan ziyade, bizim için bu temel işleri sistemde hazır tanımlı "System Functions" fonksiyonlarını kullanarak yapabiliriz. İşte bu yazıda sistem fonksiyonları içerisinde tanımlı "String Functions" ları inceleyeceğiz. String fonksiyonlar, string ifadeleri istediğimiz şekilde manüpile ederek geriye bir değer döndürürler. String fonksiyonlar "Object Explorer" penceresinde tüm veritabanlarının altında "Programmabilty", "Functions", "System Functions", "String Functions" sekmesinin altında tanımlı halde bulunurlar.
Görüldüğü üzere hemen hemen hepsi c sharp 'tan gözümüze tanıdık gelmekte. Şimdi bu fonksiyonların bazılarını inceleyelim. Tabi ki herkes tarafından bilinen "Northwind" veritabanını kullanacağız. Ama önce şunu hatırlayalım. String bir ifadenin içinde ' (özel karakter) kullanmamız gerekiyorsa iki kere ('') kullanmalıyız.
SELECT 'Galatasaray''ın Şampiyonluğu'    --Galatasaray'ın Şampiyonluğu
  • LEN: Fonksiyonu bir string ifadenin uzunluğunu sayısal olarak döner. 
     SELECT FirstName,LEN(FirstName) FROM dbo.Employees   
          Şeklinde kullanılır. Personellerin adlarının uzunluğunu geriye döndürür. Fakat "len" fonksiyonu buşlukları saymaz. Aşağıdaki sorguda "len", 6 döner. 
     SELECT LEN('    Gaffar    ')  
     
          Peki ya sayısal bir kolonun uzunluğunu öğrenmeye çalışırsam. 
     SELECT LEN(UnitPrice),UnitPrice FROM dbo.Products
          Görüldüğü üzere "." (nokta) karakterini bile sayacaktır.
  • ToLower-ToUpper: "ToLower" string ifadeyi küçük harflerle, "ToUpper" ise büyük harflerle yazdırmaya yarar. 
     SELECT LOWER('GaFFaR SaLKıM')      --gaffar salkım
     SELECT UPPER('gAffAr sAlkIm')      --GAFFAR SALKIM
  • LTrim-RTrim: Sql server 'da, c sharp 'taki "Trim" fonksiyonu yoktur. Bunun yerine "LTrim" string ifadenin solundaki boşluklar, "RTrim" ise sağındaki boşlukları siler. İki taraftaki boşlukları da silmek isteniyorsa bu iki fonksiyonu içiçe kullanmak gerekir.
     SELECT LTRIM('    Gaffar    ')                  --Gaffar    
     SELECT RTRIM('    Gaffar    ')                  --    Gaffar
     SELECT RTRIM(LTRIM('    Gaffar Salkım    '))    --Gaffar
  • Reverse: String bir ifadeyi tersten yazdırır. 
     SELECT REVERSE('Gaffar Salkım')    --mıklaS raffaG
  • Substring: String bir ifadenin verdiğimiz index numarasından başlayarak, istediğimiz kadar karakterini almamızı sağlar. Geriye yine string bir ifade döner.
     SELECT SUBSTRING('Şampiyon Galatasaray',10,6)   --Galata
          Örneğin gelin personellerin adının son 3 harfini  yazdıralım.
     SELECT FirstName,SUBSTRING(FirstName,(LEN(FirstName)-2),3) FROM dbo.Employees

  • Space: Verilen sayı kadar boşluk karakteri atar.         
     SELECT 'Gaffar'+SPACE(5)+'Salkim'    --Gaffar   Salkim
  • Ascii: Verilen karakterin "ascii" karşılığını verir.
     SELECT ASCII('A')                    --65
  • Char: Verilen "ascii" kodun "char" karşılığını verir.
     SELECT CHAR(65)                      --A
  • CharIndex: Birinci parametresindeki stringin, ikinci stringdeki konumunu yani indexini döndürür. Bulamazsa 0 döndürür.
     SELECT CHARINDEX('büyük','En büyük Galatasaray')   --4  
  • Replicate: Verilen string ifadeyi, verilen sayı kadar tekrar ettirerek yazar.
     SELECT REPLICATE('OK',3)    --OKOKOK
  • Left: Verilen stringin başından verilen sayı kadar alır.
     SELECT LEFT('asa',2)        --as
  • Right:  Verilen stringin sonundan verilen sayı kadar alır.
     SELECT RIGHT('asa',2)       --sa
  • Stuff: Bu fonksiyon aşağıdaki örnekte 1. stringden 2. karakterinden başlayarak 3 karakter siler. Silinenler yerine 2. stringi koyar.
     SELECT STUFF('Gaffar',2,3,'Salkim')    --GSalkimar
  • Str: Verilen "double" sayıyı stringe dönüştürür. 1. parametresi "double" sayı, 2. 'si "double" sayının uzunluğu, 3. 'sü "decimal" kısmının uzunluğudur.
     SELECT STR(123.4,6,1)      --123.4

Umarım yardımcı olabilmişimdir.

Başka bir yazıda görüşmek dileğiyle, hoşçakalın...

26 Nisan 2012 Perşembe

MS SQL 'de User Defined Functions - Giriş

Merhaba arkadaşlar.
Sql server 'da çok sık kullandığımız işlemleri, her defasında farklı değerler için kullanıyorsak, o işlemleri tekrar tekrar yazmaktansa bir kere tanımlayıp, istediğimiz yerde kullanabiliriz. Nasıl c sharp 'ta gereksiz yere kod tekrarı yapmak istemiyorsak, t-Sql dilinde de bu durum aynı arkadaşlar. Yapılacak işlemleri farklı değerlere göre uygulamak ve bu işlemlerden dönen değerlere göre sonuç almak için kullanılan kodların tümüne "function" adı verilir. Nasıl programlamada geriye değer döndüren metotlara function diyorsak bu durum burada da geçerlidir.

Normalde sistemde kayıtlı bir çok function vardır. Bunların tümüne "System Functions" diyoruz. Bunlar sayesinde datalarımızı istediğimiz gibi manipule (yönetme) edebiliyoruz. Ama bazen system functions 'lar da yetersiz kalıyor. İşte bu durumda arkadaşlar kendi fonksiyonlarımızı yazmak mecburiyetindeyiz. İhtiyaçlarımız doğrultusunda bizim tanımladığımız bu fonksiyonlara da "User Defined Functions" (kullanıcı tanımlı fonksiyonlar) diyoruz.

Peki fonksiyonlar neden kullanılır?
  • Pratiklik: Yukarıda da belirttiğim üzere gereksiz yere kod tekrarı yapmaktan kurtarır. Bir işlemi her defasında yazmaktansa bir kere tanımlayıp, her yerden çağırma olanağı sunar.
  • Kod Okunabilirliği: Bir script içerisinde daha az kod kullanılacağından dolayı, bizi kod karmaşasından kurtarır.
  • Performans: Fonksiyonların en önemli özelliğidir. Nasıl bir performanstan bahsediyoruz biraz inceleyelim. Bir sorgu çalışmadan önce 5 aşamadan geçer. Önce kodun yazım hataları, syntax 'ı, semantic 'i kontrol edilir(Parse). Daha sonra sorguda kullanılan tabloların kolonları var mı, ona bakılır(Resolve). Bu ıslemden sonra sorgunun sonucunu nasıl döndüreceğini, indexlemeleri kontrol eder(Optimize). Daha sonra döndüreceği şeklı belirledikten sonra derleme işlemi yapılır(Compile). Son olarak sorgu çalışır ve sonuç döner(Execute). Fonksiyonumuz çalıştığında, "compile" işlemi dahil compile 'dan önceki tüm aşamaları işlemeden geçer. Geriye sadece "execute" işlemi kalır. Bu da önemli bir hız demektir.
NOT: "User Defined Functions" , "Strored Procedures" , "Views" yukarıda anlattığım sebepten dolayı, şablon yapıları itibariyle "Subquery" 'lerden (iç içe sorgulardan) daha performanslı çalışır.

"User Defined" fonksiyonlarını "Strored Procedures" 'lerden ayıran en büyük özellik ise sorgu içerisinde kullanılabilmeleridir. "Strored Procedures" 'ler sorgu içerisinde kullanılmazlar. Çünkü başlı başına bir iş yaparlar. "User Defined" fonksiyonları ise bir işi yapmada yardımcı fonksiyon olarak çalışırlar.

"User Defined Functions", parametre almaları şart değildir. Parametresiz olarak da kullanılabilirler. Fakat geriye mutlaka bir değer döndürdüklerinden dolayı "returns" ve "return" keyword 'lerini kullanmalıdırlar.

Fonksiyonlar database nesneleridir. Bu nedenle DDL (Data Defination Language) dili ile yönetilirler. Yani "create, alter ve drop" keyword 'leriyle kullanılırlar. Database nesneleri oldukları için hangi database 'de oluşturulmuşlarsa, "object explorer" penceresinde o database sekmesi altında "Programmability" sekmesinin de altında "Function" sekmesinde yer alırlar. Aşağıda da görüldüğü gibi "Function" sekmesi altında 4 tane sekme mevcuttur. "Aggregate Functions" ve "System Functions" sistemde tanımlı sistem fonksiyonlarıdır. "Table-valued Functions" ve "Scalar-valued Functions" ise bizim tanımladığımız "user defined functions" fonksiyonlardır.


"User Defined Functions" 'ları 3 ana başlık altında inceleyeceğiz:
  1. Scalar Functions
  2. In-Line Table Valued Functions
  3. Multistatement Table Valued  Functions
"Scalar Functions" geriye sadece tek bir değer dönen durumlarda kullanırlar. Diğer iki "Table Valued Functions" ise geriye bir tablo döndüren durumlarda kullanılırlar. "Scalar" ve "In Line Table Valued" fonksiyonları sadece "select" sorgularını kullanabilirler. (Bu yönde "View" nesneleriyle benzerlik gösterirler. Fakat bildiğiniz üzere "view" nesneleri parametre alamazlar.) "Multistatement Table Valued" fonksiyonları ise gövdesinde "DML (Data Manipulation Language-Veri Yönetim Dili)" dilini kullanabilir. Yani içinde "insert,update ve delete" sorguları çalıştırabilir.

"Scalar" fonksiyonlar tanımlanırken değil ama çağırılırken ikinci kısmıyla birlikte yani başında "dbo." (Database Owner - Veritabanı Sahibi) sözcüğü ile çağırmak zorundadır. "Table Valued" fonksiyonlarında böyle bir zorunluluk yoktur. Ayrıca "Scalar" ve "Multistatement Table Valued" fonksiyonlarda "begin-end" sözcüklerinin kullanılması şarttır. Bizim c-sharp 'ta kullandığımız skopların yaptığı görevi görür. "In Line Table Valued" fonksiyonlarda böyle bir şart yoktur.

"User Defined" fonksiyonları tanımlandıktan sonra "Object explorer" penceresindeki yerleri farklı olabilir. "Scalar" fonksiyonlar "Scalar-valued Functions" sekmesinde, "In-Line Table Valued" ve "Multistatement Table Valued " fonksiyonları ise "Table-valued Functions" sekmesinde yer alırlar.

"User Defined Function" konusuna giriş yaptık. İlerleyen makalelerimde daha ayrıntılı bir şekilde inceleyeceğiz.

Başka bir yazıda görüşmek dileğiyle, hoşçakalın...