SQL Server, veri tipi dönüşümünden kayıtları bir araya getirip analiz etmeye kadar birçok yerleşik (built-in) işlev barındırmaktadır.

Bu bölümde, SQL Server fonksiyon türleri hakkında bilgi edinecek daha sonra da skaler fonksiyonlarla çalışacağız.

SQL Server Built-in Fonksiyon Türleri

SQL Server’da bulunan built-in fonksiyonlar aşağıdaki gibi kategorilere ayrılabilir:

KategoriAçıklama
SkalerTek satır üzerinde işlem yapıp tek bir değer döndürür.
Grouped AggregateBir veya daha fazla input alarak özetleyici tek bir değer döndürür.
WindowBir grup satır üzerinde çalışır.
RowsetT-SQL’de kullanılabilecek bir sanal tablo döndürür.

Not: Bu ve sonraki bölümlerde aggregation, window ve skaler fonksiyonları tartışacağız. Rowset fonksiyonlarına fazla girmeyeceğiz.

Skaler Fonksiyonlar

Skaler fonksiyonlar tek değer döndürür. GETDATE fonksiyonu gibi hiç bir input parametresi almayabilir, UPPER fonksiyonu gibi bir tane alabilir ya da DATEADD fonksiyonu gibi birden fazla parametre alabilirler.

Yerleşik skaler fonksiyonlar string, dönüşüm, mantıksal, matematiksel ve diğer türlerde birçok kategoride düzenlenebilir. Bu bölümde birkaç genel skaler fonksiyona bakacağız.

Skaler fonksiyonları kullanırken dikkat edilmesi gereken bazı noktalar şunlardır:

  • Determinizm: Fonksiyon her seferinde aynı input ve veri tabanı için aynı değeri döndürür mü? Birçok built-in fonksiyon kararsızdır, bu nedenle dönen sonuçlar indexlenmez. Bu durumun, sorgu işlemcisinin sorguyu yürütürken index kullanma yeteneği üzerinde etkisi olacaktır.
  • Collation: Karakter verileri kullanan fonksiyonlar hangi collation kullanılır? Bazı fonksiyonlar input collation’ı kullanırken; bazıları da input collation’ı sağlanmazsa veri tabanı collation’ı kullanır.

Aşağıdaki listede bazı temsili örnekler verilmiştir:

  • Tarih ve saat fonksiyonları (daha önceki bölümlerde anlattık).
  • Matematiksel fonksiyonlar.
  • Dönüştürme işlevleri (sonraki bölümlerde ele alacağız).
  • Sistem meta veri fonksiyonları.
  • Sistem fonksiyonları.
  • Metin ve görüntü fonksiyonları.

Aşağıdaki YEAR fonksiyonunun SELECT ifadesinde kullanıldığı bi örnek gösterilmiştir.

Fonksiyon, bir satırdaki belirlenmiş sütun değeri kullanılarak her satır başına bir kez hesaplanır:

SELECT orderid, orderdate, YEAR(orderdate) AS orderyear
FROM Sales.Orders; 

Dönen sonuç:

orderid orderdate orderyear
----------- ----------------------- -----------
10248 2006-07-04 00:00:00.000 2006
10249 2006-07-05 00:00:00.000 2006
10250 2006-07-08 00:00:00.000 2006 

Aşağıdaki SELECT ifadesinde, verilen input değerinin mutlak değerini döndüren ABS fonksiyonunun kullanıldığı bi örnek gösterilmiştir.

SELECT ABS(-1.0), ABS(0.0), ABS(1.0); 

Dönen sonuç:

--- --- ---
1.0 0.0 1.0 

Aşağıdaki örnekte, kullanıcının oturumu tarafından kullanılmakta olan veri tabanının adını döndürmek için DB_NAME () sistem meta veri fonksiyonu kullanılmaktadır:

Select DB_NAME() AS current_database;

Dönen sonuç:

Current_database
-------------------
TSQL
Aggregate Fonksiyonları

Aggregate fonksiyonları, GROUP BY ifadesinde tanımlanan satırlar üzerinde işlem yaparak özet sonuç döndürür. SUM, MIN, MAX COUNT ve AVG bunlara örnek olarak gösterilebilir. GROUP BY ifadesi kullanılmadığında ise tüm satırlar bir kümeymiş gibi kabul edilir aggregate işlemi gerçekleştirilir.

SELECT COUNT(*) AS numorders,
SUM(unitprice) AS totalsales
FROM Sales.OrderDetails; 

Dönen sonuç:

numorders totalsales
----------- -----------
2155 56500.91 

Not: Aggregate fonksiyonları ve GROUP BY ifadsi sonraki bir bölümlerde ele alınacaktır.

Window Fonksiyonları

Window fonksiyonları, kullanıcı tanımlı satır, küme veya window’da kullanarak hesaplamalar yapmamızı sağlar. Bu fonksiyonların içerisinde sıralama, toplama, offset ve distribution gibi fonksiyonlar vardır. Window fonksiyonları, OVER deyimi kullanılarak tanımlanır. Tanımlandıktan sonra da belirtilen kümelere window fonksiyonları uygulanır .

Aşağıdaki örnekte, birim fiyata dayalı sıralama işlemi gerçekleştirmek için RANK fonksiyonu kullanılmıştır; en yüksek fiyat 1, sonraki en yüksek 2 vb. gibi.

SELECT TOP(5) productid, productname, unitprice,
RANK() OVER(ORDER BY unitprice DESC) AS rankbyprice
FROM Production.Products
ORDER BY rankbyprice; 

Dönen sonuç:

productid productname unitprice rankbyprice
----------- ------------- ---------- -------------
38 Product QDOMO 263.50 1
29 Product VJXYN 123.79 2
9 Product AOZBW 97.00 3
20 Product QHFFO 81.00 4
18 Product CKEDC 62.50 5

Not: Window fonksiyonları ilerleyen bölümlerde tekrar ele alınacaktır. Bu örnek yalnızca açıklama amacıyladır.

Rowset Fonksiyonları

Rowset fonksiyonları, kendilerine özgü parametreler alarak sorgu içerisinde başka bir yerde kullanılabilecek bir sanal tablo oluştururlar. Bunlar arasında OPENDATASOURCE, OPENQUERY, OPENROWSET ve OPENXML yer alır.

Örneğin, OPENQUERY fonksiyonuyla bağlı olunan bir sunucuya bir sorgu gönderilir. Fonksiyon, input değeri olarak, bağlı olunan sunucunun sistem adını ve gönderilecek sorgu tanımını alır. Gönderilen sorgu belirtilen sunucuda çalışır ve sorgudan dönen sonuç rowset (sanal tablo) halinde OPENQUERY fonksiyonunu içeren sorguya tekrar döndürülür.

Kaynak :
Deterministic and Nondeterministic Functions (Transact-SQL)
Rowset Functions (Transact-SQL)
Built-in Functions (Transact SQL)