Miuul İnceleme

SQLSharp ile T-SQL’in Sınırlarını  Genişletin

Bu makalede SQL Server üzerinde TSQL'in yeteneklerini arttırabileceğimiz bir CLR kütüphanesi olan SQLSharp'ı anlatıyorum.


Görsel: Mikita Rasolka

“Widen your world” Türk Hava Yolları’nın çok beğendiğim sloganı. “Dünyanızı genişletin.”  Bu makalenin başlığını biraz bu slogandan örnek alarak koydum. Zira oldukça yetenekli olan TSQL’in yeterli olmadığı ve bizim uygulama yazarak sorunu halletmek zorunda kaldığımız durumlar için oldukça yetenekli bir tool olan, yani TSQL’in sınırlarını genişletebileceğimiz bir tool olan SQLSharp’tan bahsedeceğim.

Veri ile uğraşanların ilk bilmesi gereken konulardan biri belki de ilki SQL. Çünkü uğraştığımız veri genellikle tablo, satır ve sütunlardan oluşan yapılandırılmış veri. Bu veri genelde veritabanlarında tutuluyor ve bu veriyi analiz edebilmek için SQL’i bilmek şart.

Veri analistlerinin, raporlama uzmanlarının, veri mühendislerinin bilmesi gereken ikinci konu ise TSQL, PLSQL gibi veritabanı yönetim sistemlerinin kendilerine özgü geliştirdikleri diller. Bu konuda açıkçası TSQL bilmek daha avantajlı. Zira TSQL (Transact SQL) SQL Server’ın özelleştirilmiş sorgulama dili ve Oracle’dan daha yaygın olarak kullanılıyor.
 

Peki nedir bu TSQL ve yetenekleri nelerdir?

TSQL bir programlama dilinde kullandığımız bir çok 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 veritabanları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 bir çok işlemler yaparız. İşte TSQL bize bu işlemleri yapabilecek yetenekte bir dildir.

Ancak bazı ihtiyaçlar vardır ki, TSQL bunları çözemez. Ancak veritabanı ile uğraşan insanlar olarak da herşeyi veritabanında halledebilme lüksüne alışmışızdır ve TSQL’in yetmediği bu durumlar için biraz hayıflanırız.

Örneğin bir sorgudan dönen değerin HTML olarak çıktı vermesi. Tabi biraz kasılsa TSQL ile yapılır ama hazır bir paket daha güzel olabilir.

Ya da Regex işlemleri için her türlü ihtiyacı karşılayacak fonksiyonlara sahip olmak.

Ya da bir web sayfasını doğrudan download ederek parse etmek. Hem de header bilgileri göndererek.

Ya da tek hareketle HTML veriyi XML’e çevirmek. Sahi, HTML bir programlama dili miydi? :)

Ya da Twitter’a bağlanarak sql kodu ile tweet atmak, tweetleri listelemek, veritabanına kaydetmek.

Buna benzer daha bir çok özellik var.  Daha fazlasını öğrenmek isteyen arkadaşlarımız için buradan help dökümanını paylaşıyorum.
 

SQLSharp ya da SQL#

Şimdi SQLSharp nedir, nasıl kurulur ve nasıl çalıştırılır biraz uygulamalara bakalım:

SQLSharp bir CLR paketidir. Yani c# üzerinde yazılıp SQL Server üzerine derlenen bir takım fonksiyonların olduğu bir dll paketi. Bunu kendiniz de yazabilirsiniz. Ama gayet güzel optimize edilmiş bir yapı hazır olarak bizi bekliyor. Ücretsiz sürümü var ve içinde bir çok fonksiyon barındırıyor. Bir de ücretli sürümü var. Sağolsunlar bu makaleyi yazmak için talep ettiğimde bana ücretli sürümün 30 günlük denemesini sundular.

Şimdi kurulumu nasıl gerçekleştirdiğimize bakalım: Bu linkten SQL Sharp için gereken dosyaları indiriyoruz. Kurulum dediğimiz dosya aslında sadece bir sql uzantılı script dosyasını çalıştırmaktan ibaret.

Şimdi bir database oluşturmamızı istiyor. Ben database'in adını SQLSharp olarak belirledim.


Gerekli düzenlemeleri yaptıktan sonra scripti çalıştırıyoruz.

İşlem tamamlandı. Yaklaşık 7 saniye sürdü.

SQLSharp database'inin altında programmability> table valued ve scalar valued functions menüsünün  altında oluşan yeni clr fonksiyonlarını görüyoruz.

Şimdi bir örnek yapalım: Örneğin TSQL’de bir string ifadenin içinde aranan bir string in bulunduğu ilk indexi görebiliriz. Ama son indexi yakalamak o kadar kolay değil. Şimdi “Microsoft SQL Server” ifadesinde “S” harfinin pozisyonunu TSQL ve SQL# ile getirelim.

--Standart TSQL Fonksiyonu ile pozisyon bulma bulunan ilk pozisyonu getiriyor.

SELECT CHARINDEX('S','Microsoft SQL Server')

--SQL# ile pozisyon bulma, son pozisyonu getiriyor.

SELECT SQL#.String_LastIndexOf('Microsoft SQL Server', 'S',0, 1)

Bazen string ifadeler içinde oynarken enter karakteri eklemek isteriz. Tabi 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.'

Yine veri analistleri için en çok ihtiyaç olan konulardan birisi de genelde csv uzantılı olan veri dosyalarının internet üzerinden indirilip sql komutları ile işlenmesidir. İşte bu anlamda da güzel bir komutumuz var: SQL#.INET_SplitIntoFields 

Örnek uygulamalar için bu adresteki örnek .csv dosyalarını kullanabilirsiniz.

Şimdi komutumuzu çalıştırarak bu linkteki 'https://people.sc.fsu.edu/ ~jburkardt/data/csv/addresses.csv' adlı dosyayı tablo olarak okumak istiyoruz.

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 de aşağıdaki komutu açmamızı istiyor. Tabi clr dediğimiz yapılar kapalı kutu olduğu için bu uygulamaları gerçek sunucunuz üzerinde değil geliştirme yaptığınız kendi makineniz gibi makinelerde yapmanızı tavsiye ederim.

External Access için komutumuzu çalıştırıyoruz.

EXEC SQL#.SQLsharp_SetSecurity 2, N'SQL#.Network';

Şimdi tekrardan webden csv okuma işlemini çalıştırıyoruz ve sonuç başarılı.

Sıradaki örneğimizde ise çektiğimiz bir sorguyu HTML olarak export edeceğiz. Bunun için AdventureWorks DB'yi kullanacağım. Bu database'i buradaki linkten indirip restore edebilirsiniz. Sonrasında 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 de Twitter komutları. Hadi şimdi de onu deneyelim. Önce bunun için yetki vermemiz gerekiyor.

EXEC SQL#.SQLsharp_SetSecurity 2, 'SQL#.Twitterizer'

Sonrasında Twitter Api’dan bir developer key almamız gerekiyor. Bu işlemlerin nasıl yapıldığı SQLSharp’ın help dökümanında anlatılıyor. Lütfen bu PDF'te sayfa 184'e bakın.


Biz örneğimize dönelim: 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 burada listelendi.

SQL# gerçekten yok yetenekli bir araç. Açıkçası SQL ve TSQL ile uğraşan herkes için bulunmaz nimet. Bu makalede SQL# ‘ın özetle nasıl kurulduğundan, ne tür yeteneklerinin olduğundan bahsettik ve kısaca birkaç örnek uygulama yaptık. Ancak bütün fonksiyonlar başlı başına birer makale olmayı hakediyor.

İlerleyen zamanlarda buradaki fonksiyonları uygulamalı senaryolar üzerinde tekrar anlatacağım.

Başka bir makalede görüşmek dileğiyle,
Sağlıcakla.

Dengesiz Veri Seti Ne Zaman Problem Olur?

Nehir Günce Daşcı

Makine Öğrenmesinde Değişken Seçimi: Filtreleme Yöntemleri

Simge Erek

Trigram ile SQL Server'da Aşırı Hızlı Text Arama

Ömer Çolakoğlu

SON İNCELEMELER

GİRİŞ

Aşağıya kaydolduğunuz e-postayı girin. Şifrenizi sıfırlamanız için size bir bağlantı göndereceğiz.

Giriş Ekranına Dön
Şifre sıfırlama talimatları
adresine gönderildi.