For Json

For Json, Sql Server 2016 yeniliklerinden belkide en önemlisi.

Bu versiyonu kullandığımız da sorgu sonuçlarını direk Json biçiminde ala bilmekteyiz. Teknik olarak for xml ile aynı işlevsellikte verileri dışa aktarabiliriz.
Günümüz modern web ve mobil uygulamaların sıkça tercih ettiği bir veri biçimi olduğundan Sql Server 2016 il yerleşik olmasa da baya bir destek geldiğini söyleyebiliriz.

MSSQL için Xml aynı zamanda bir veri tipi iken Json değildir. Buna karşın Json verilerini nvarchar olarak saklayıp özel fonksiyonlar ile sorgulayabilirsiniz.

Basit bir örnek yapalım.
t­sql

json result

Şimdi örneği biraz ileri götürelim.
İstemci uygulamasının web olduğunu ve Js tabanlı bir DataGrid kullandığımızı varsayalım.
Örneğin Bootgrid. Bootgrid, verileri listelemek ve sayfalamak için bizden aşağıdaki gibi biçimde Json verisi ister.

Şimdi ihtiyacımız olan verileri Json olarak dışarı aktaran t-­sql kodunu yazalım.

Son olarak klasik Ado.Net ile verileri alalım.

Elbette ki de sadece bu kadar değil. DB seviyesinde bir kaç numara daha yapmanızı sağlayacak hareketler mevcut. Neler mi?

OPENJSON

Bu fonksiyon, nvarchar biçimde ki json verisini tablo verisine çevirmeye yarıyor.

Normal şartlarda “for json” komutu uyumluluk seviyesi 2014 de de çalışsa bile bu tip fonksiyonlarda ise mutlaka 2016 olması gerekiyor.

t­-sql

sonuç

Product Table

OPEN_VALUE

Json biçiminde saklı veri üzerine işlem yapmanıza olanak verir. Aşağıdaki gibi bir ürün tablosu tasarlayalım.

Product Table / Design

PropersitesÖzellikler tahmin edeceğiniz gibi Json biçiminde veri saklayacak. Amacımız, tüm ürünlerin özellik tanımları eşit olmayacağından dolayı şema bağımsız bir yapı elde etmek.
Örnek veri ekleyelim.

Select atalım ama detaylı olsun 🙂

For Json

JSON_MODIFY

Json formatında saklı verileri güncellemek için kullanılır. Bir önceki örnekten devam edelim.

Benim gibi veritabanı seviyesinde çok iş yapmayı sevmiyorsanız pek kullanacağını sanmam. Lakin bilmekte fayda var yoksa problemleri nasıl çözeceğiz 🙂

Linq İle Pivot

Pivot şeklinde veri çıktısı almanın sql ile çokta pratik olmadığını yaşayarak öğrendik. Taaaaaki LINQ‘ in .Net Framework’ e entegre olana kadar. Bu sorgulama tekniği sayesinde eskiden daha uzun uğraşlar sonrası elde ettiklerimize daha kolay ulaşır olduk.

Linq;
Açılımı => Language Integrated Query
Okunuşu => link

Bu yazıda ise  Group by yardımı ile Pivot görünümlü veri çıktısı nasıl alınır ona değineceğim.

Tablo Yapısı

Veri yapımız diagramda görüldüğü gibi. Yazılar ve Kategoriler adlı iki adet ana tablo ve bunları bağlayan bir adet yardımcı tablo.
Diagram

Group By

Group by, select sorgularında  sayısal fonksiyonların gösteriminde kullanılan oldukça faydalı bir anahtar sözcüktür. Basit bir örnek ile anlatmak gerekir ise; Hangi kategoriden kaçar adet yazı girilmiş listelemek istersek Count fonksiyonunu kullanmak gerekir. Sadece Count kullanmak yeterli olmayacaktır bize kategori adı da lazım. Sebebi ise Count sadece tek bir satır ve sütun döndürür ama kategori adı ise bir yada birden fazla. Sistem bu durumda karasız kalacağı için hata verecek ve group by kullanamızı isteyecek. Yani;

Pivot

Yukarıdaki örneği biraz ileriye götürelim. Kategori bazında 2010 yılında aylık kaç adet yazı yayınlanmış ay ay listeyelelim. Bu da pivota açılan kapı.

Sonuç;
Table

SqlBulkCopy İle Veri Kopyalama

Excel yada benzeri bir kaynaktan elde ettiğimiz yaklaşık bir milyon kayıt içeren bir DataTable olduğunu düşünelim. Bu kayıtları veritabanında ki x bir tabloya nasıl eklerizinsert ?

Tek tek Insert yapmak mı? Bildiğin intihar olur.
DataAdapter ile UpdateGüncelleme yapmak mı? İnanılmaz zahmetli ve gereksiz.(Çalışacağından emin bile değilim)

Biri Bulk Insert mü dedi, işte aradığımız cevap.
Bulk Insert, yüklü miktarda ki verileri herhangi bir tablotable ya performanslı bir şekilde aktarmak için veri katmanında kullanabileceğimiz bir komuttur. Ado.Net teknolojisi SqlBulkCopy (kısaca sbc diyelim) sınıfıclass ile bu işlemi kolaylıkla kullanmamıza olanak verir.
Tabi kullanımı bu kadar kısıtlamamak gerekir. Sbc ile iki farklı sunucu yada aynı sunucu içinde iki farklı tablo da kopyalanabilir.

Örnek

Excel dosyasındaki verileri DataTable nesnesine dolduracağız.  Sonar Sbc ile DataTable içindeki verileri örnek bir tabloya ekleyeceğiz.

Örnek Excel dosyası
Excel

Hedef tablo
Table

Excel dosyasındaki alanlar ile tablo alanlarını bilerek farklı isimlendirdim. Sbc sınıfının bir özelliği de bu gibi durumlarda alanları adresleyebilmesidirmapping.

Sql Server Management Studio’dan Kod Çalma

Hepimiz zaman zaman standart Sql komutları (select insert gibi) dışında da kodlar yazmak durumda kalabiliyoruz. Çok tekrarlanmayan kodlar maalesef hafızamızda kalmıyor. Bu gibi durumlarda SSMS dan yardım almakta bir sakınca görmüyorum 🙂

Bu yazıda bildiğim 4 yöntemi sizlerle paylaşacağım.

1 – Template Explorer

View -> Template Explorer ile açılan pencere içinde birçok işlevin templateşablon kodlarına ulaşabilirsiniz. Çift tıkladığımızda kodlar ekrana gelecektir. Kolaylık olması için Ctrl+Shift+M kısa yolu ile template içindeki değişkenlere erişebilir ve değiştirebilirsiniz.

Sql Cheat 1

2 – Script As

Object Explorer içindeki sınıflere sağ tıklama ile erişebileceğiniz Script As menusu ile sql kodlarını elde edebilirsiniz.

Sql Cheat 2

3 – Generate Scripts

Yine Object Explorer içinde Database sınıfsine sağ klik ile Tasks -> Generate Scripts… ile açılan sihirbazwizard ile sql kodları oluşturabilirsiniz.

Sql Cheat 3

4 – Script Action

Son olarak işlem yapılabilen pencerelerde bulunan Script düğmesibutton yardımı ile sql kodları da oluşturmak mümkün.

Sql Cheat 4

Umarım yardımı dokunmuştur.

Sınırsız Ağaç Yapısı İle Kategori Listeleme

Sınırsız ağaç yapısı ile veri listeleme tablo yapısı basit ama uygulama tarafı kod yazması tam tersine biraz karmaşıktır. Gelin bunu bir örnek ile açıklayalım.

YAPI

Aşağıdaki gibi bir tablomuz olsun. Sınırsız kategori ve alt kategorileri tutan.
Data Diagram
Kategori, hiyerarşinin en üstünde ise alt kategori değeri 0sıfır değilse üst kategorinin id değeri yer alacak.
Örneğin;
Kitap, kendi kategorisinde en tepede yani alt kategori değeri 0. Dünya Klasikleri ise Kitap kategorisinin altında olduğu için alt kategori değeri Kitap kategorisinin CategoryID değeri olacak yani 1 gibi …
Kategori Tablosu

Azıcık kod yazalım.
Kategori tablosunu DataTable la doldurarak başlayalım. Bu hamle işimizi bi hayli kolaylaştıracaktır. Daha sonra recursiveyinenelen bir metot yardımıyla kategori ve alt kategori bitinceye kadar döneceğiz. Son olarak ta elde ettiğimiz değerleri Treeview kontrolüne nodedüğüm olarak ekleyeceğiz.

Eğer karışık geldi ise biraz recursive çalışın.

Sonuç

Treeview