Widen your world (Dünyanızı genişletin) Türk Hava Yolları’nın beğendiğim bir sloganı. Bu yazının başlığını biraz da bu slogandan ilham alarak belirledim. Bu yazıda T-SQL’in yeterli olmadığı, ancak uygulama yazarak karşılaştığımız sorunu çözebileceğimiz durumlarda öne çıkan oldukça yetenekli bir araç olarak T-SQL’in sınırlarını genişleten SQLSharp’ı ele alıyoruz.
Veri ile uğraşanların bilmesi gereken ilk konulardan biri SQL. Nitekim üzerinde çalışılan veri genellikle tablo. Yani satır ve sütunlardan oluşan yapılandırılmış bir veri. Bu veri genelde veri tabanlarında tutuluyor ve bu veriyi analiz edebilmek için SQL’i bilmek gerek.
Veri analistlerinin, raporlama uzmanlarının ve veri mühendislerinin bilmesi gereken ikinci bir konu ise T-SQL, PLSQL gibi veri tabanı yönetim sistemlerinin kendilerine özgü geliştirdikleri diller. Bu konuda açıkçası T-SQL bilmek daha avantajlı. Zira T-SQL (Transact-SQL) SQL Server’ın özelleştirilmiş sorgulama dili ve Oracle’dan daha yaygın kullanılıyor.
T-SQL bir programlama dilinde kullanılan çoğu yapıyı kullanma imkanı sunan bir script dili. Örneğin SQL dilinde dört temel komut vardır: Select, Insert, Update, Delete. Bunlar veri sorgulamak için kullandığımız tüm veri tabanlarında ortak kullanılan komutlardır. Ancak programlama dillerinde değişken tanımlama, döngü tanımlama, bir takım tarih, saat, string, matematik fonksiyonları kullanma, dosya okuma, web servise bağlanma, harici uygulama çalıştırma gibi işlemler yaparız. T-SQL bu işlemleri bizim için gerçekleştirebilecek yetenekte bir dildir.
Ancak bazı ihtiyaçlar vardır ki T-SQL bunları çözemez. Veri tabanı ile uğraşan insanlar olarak her şeyi veri tabanında halledebilme lüksüne alışmışızdır ve T-SQL’in yetmediği bu durumlar için biraz hayıflanırız.
Örneğin bir sorgudan dönen değerin HTML olarak çıktı vermesi... Tabii biraz zorlasak T-SQL ile yapabiliriz ama hazır bir paket daha güzel olabilir. Regex işlemleri için her türlü ihtiyacı karşılayacak fonksiyonlara sahip olmak da güzel olurdu. Bir internet sayfasını doğrudan download ederek parse etmek de... Tek hareketle HTML veriyi XML’e çevirmek ya da Twitter’a bağlanarak SQL kodu ile tweet atmak, tweetleri listelemek, veri tabanına kaydetmek… SQLSharp işte bunlar ve bunlara benzer birçok noktada ihtiyacımızı karşılayabilecek yetkinlikte ve T-SQL'in sınırlarını ihtiyaçlarımız doğrultusunda olabildiğince genişletiyor. Daha fazlasını öğrenmek isteyenler bağlantıdaki dökümanı inceyebilir.
SQLSharp (SQL#) bir CLR paketidir. Kısaca C# üzerinde yazılıp SQL Server üzerine derlenen bir takım fonksiyonların olduğu bir dll paketi. Bu tarz paketleri kendiniz de yazabilirsiniz. Ama gayet nitelikli bir biçimde optimize edilmiş bir yapı hazır olarak bizi bekliyor. Ücretsiz sürümü var ve içinde oldukça fazla fonksiyon barındırıyor. Ücretli sürümü de bulunmakta. Bu yazıyı hazırlama sürecinde talep ettiğimde bana ücretli sürümü 30 gün için sundular.
SQLSharp kurulumunu nasıl gerçekleştireceğimize bakalım. Bağlantıdan gereken dosyaları indirebilirsiniz. Kurulum dediğimiz şey aslında sadece bir SQL uzantılı script dosyasını çalıştırmaktan ibaret. Scripti SQL Management Studio'da açarak {replace_with_DB_name} yazılı kısmı kurulumu gerçekleştireceğimiz veri tabanının ismi ile değiştiriyor ve "/* replace the DB name and remove this comment starting with the "/*" at the left" yazılı yorumu siliyoruz. Ardından scripti çalıştırıyoruz.
Bu işlemin tamamlanmasının ardından SQLSharp kurulumunu yaptığımız veri tabanının altında Programmability -> Functions -> Table-valued functions ve Scalar-valued functions klasörlerinde oluşan yeni CLR fonksiyonlarını görebiliriz.
T-SQL’de bir string ifadenin içinde aranan bir stringin bulunduğu ilk indexi görebiliriz. Ama son indexi yakalamak o kadar kolay değil. Şimdi “Microsoft SQL Server” ifadesindeki “S” harfinin pozisyonunu T-SQL ve SQL# ile getirelim.
--Standart T-SQL fonksiyonu ile pozisyon bulma bulunan ilk pozisyonu getiriyor.
SELECT CHARINDEX('S','Microsoft SQL Server')
--SQL# ile pozisyon bulma ise son pozisyonu getiriyor.
SELECT SQL#.String_LastIndexOf('Microsoft SQL Server', 'S',0, 1)
Bazen string ifadeler içinde oynarken enter karakteri eklemek isteriz. Tabii bu karakter HTML'de başka, normal ifadede başka şekilde eklenir. SQL#’ta ise çok kolay.
PRINT 'This is a test of ' +
SQL#.String_Newline('win') +
'how newlines' +
SQL#.String_Newline('html') +
'work in SQL strings.' +
SQL#.String_Newline('XHTML') +
'work in SQL strings.'
Veri analistlerinin en çok ihtiyaç duyduğu konulardan birisi de CSV uzantılı dosyalarının internet üzerinden indirilip SQL komutları ile işlenmesidir. İşte bu anlamda da güzel bir komutumuz var: SQL#.INET_SplitIntoFields
Uygulama için bu bağlantıdaki örnek CSV dosyaları kullanılabilir. Biz addressess.csv dosyasını kullanalım.
EXEC SQL#.INET_SplitIntoFields
'https://people.sc.fsu.edu/~jburkardt/data/csv/addresses.csv', -1, ','
Gördüğümüz gibi sistem hata verdi. External Access için bir güvenlik özelliğinin açılmasını istiyor. Bunun için ise aşağıdaki komutu açmamızı istiyor. CLR dediğimiz yapılar kapalı kutu olduğu için bu uygulamaları gerçek sunucunuz üzerinde değil, geliştirme yaptığınız makinelerde yapmanızı tavsiye ederim.
External Access için komutumuzu çalıştırıyoruz.
EXEC SQL#.SQLsharp_SetSecurity 2, N'SQL#.Network';
Şimdi tekrar CSV okuma işlemini çalıştırıyoruz ve sonuç başarılı.
Sıradaki örnekte ise çektiğimiz bir sorguyu HTML olarak export edeceğiz. Bunun için AdventureWorks veri setini kullanacağım. İndirip restore ettikten sonra aşağıdaki komutla sorgu çıktısını HTML olarak görebiliyoruz.
DECLARE @HTMLOutput NVARCHAR(MAX)
SELECT @HTMLOutput =
SQL#.DB_HTMLExport('SELECT TOP 2 * FROM
AdventureWorks2019.Production.ProductReview',
'', 'word', '-NULL-', 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, 'returns',0)
PRINT @HTMLOutput
Bir diğer güzel örnek ise Twitter komutları. Bu çalışma için öncelikle yetki vermemiz gerekiyor.
EXEC SQL#.SQLsharp_SetSecurity 2, 'SQL#.Twitterizer'
Ardından Twitter API’dan bir developer key almamız gerek. Bu işlemlerin nasıl yapıldığı SQLSharp’ın ilgili dökümanında anlatılıyor. PDF'te 184. sayfayı inceleyebilirsiniz.
Basitçe @miuulcom hesabının attığı tweetleri çekelim.
DECLARE @ConsumerKey NVARCHAR(100),
@ConsumerSecret NVARCHAR(100),
@AccessToken NVARCHAR(100),
@AccessTokenSecret NVARCHAR(100)
SELECT @ConsumerKey = 'M5cljOHyxxxxxxxxxxxxxxxxxx',
@ConsumerSecret = 'eGmS7JNbzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
@AccessToken = '6275631665-knmaxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
@AccessTokenSecret = ' wvKGQ7rfL3xxxxxxxxxxxxxxxxxxxxxxxxxxxx'
DECLARE @Params SQL#.Type_HashTable
SET @Params = @Params.AddItem('screen_name', 'miuulcom')
SET @Params = @Params.AddItem('count', '50')
SELECT * FROM SQL#.Twitter_GetUserTimeline(@ConsumerKey, @ConsumerSecret,
@AccessToken, @AccessTokenSecret, @Params)
Gördüğünüz gibi miuulcom tarafından atılan tweetler listelendi.
SQL# gerçekten oldukça yetenekli bir araç. SQL ve T-SQL ile uğraşan herkes için bulunmaz nimet denebilir. Bu yazıda SQLSharp‘ın kısaca nasıl kurulduğundan ve ne tür yeteneklerinin olduğundan bahsederek birkaç örnek uygulama gerçekleştirdik. Ancak SQLSharp'ın sahip olduğu her bir fonksiyon başlı başına birer makale olmayı hak ediyor.
T-SQL hakkında daha geniş kapsamlı bilgiye erişmek, kariyerinizde bilginizle fark yaratmak isterseniz Miuul'un sunduğu T-SQL ile Veritabanı Programlama eğitimine göz atabilirsiniz.