Yazılım Mimarileri ve Tasarım Desenleri Üzerine

Transact Sql(Değişkenler-Batch Kavramı-If Yapısı-Exists-While Döngüsü-Geçici Tablolar-Uniqueidentifier Tipi)

Bu yazımızda Transact Sql’e devam ediyoruz.Değişkenler,İf şartı,geçici tablolar ve while döngüsü gibi konulara değineceğim.
DEĞİŞKENLER
Her programlama dilinde olduğu gibi T-SQL de de değişken vardır.Aşağıdaki yapı bir değişken tanımlamasıdır.


declare @isim varchar(60)

Değişkenler “declare” ile tanımlanıp sonrasında değişkene ad verilir.Değişken adları “@” ile başlar.Son olarakta değişken tipini yazmamız yeterlidir.


declare @ad varchar(60),@soyad varchar(60),@yas int

Tek satırda birden çok farklı tipte değişken tanımlanabilir.


declare @isim varchar(50)
set @isim = 'Gençay'
select @isim

Değişkenimize “set” komutu sayesinde değer aktarabiliyoruz.Yukardaki şekilde select sorgusunda değişkeninin değerini alabiliyoruz.


print @isim --ya da print komutunu kullanarak mesaj olarakta değerini okutabiliyoruz.

Ama dikkat etmemiz gereken bir nokta var.T-SQL de seçtiğimiz satırı Execute yaparsak çalışır.Değişkenlerde buna dikkat etmeliyiz.”declare” ile başlayan satırı önce Execute yapıp ondan sonra o değişken üzerinden işlem yapamayız.Her işlemde bütün yapıyı seçip Execute yapmamız gerekiyor.
BATCH KAVRAMI (GO)
Tek pencerede yazılan birbirinden ayrı sorguların gerçekten birbirinden ayrı olduğunu derleyiciye göstermek için “Go” kullanılır.
IF YAPISI
Her programlama dilinin olmazsa olmazı if yapısı T-SQL de de bulunmaktadır.
Hemen bir örnek gösterelim,


declare @ad nvarchar(50)
set @ad = 'Gençay'
if @ad='Gençay'
print 'Evet Gençay'
else
print 'Hayır Gençay değil'

Şimdi bir örnek daha gösterebilmek için “Northwind” veritabanına dönelim ve “Müşteriler” tablosunda çalışalım.
Hiç Amerikalı müşterim var mı?(Bu sorunun cevabını evet ya da hayır olarak verdireceğiz.Amerikalı müşteriler USA ile belirtilmiştir.)


select * from Musteriler where Ulke='USA'
if @@ROWCOUNT>0
print 'Evet Amerikalı müşteri var.'
else
print ‘Hayır Amerikalı müşteri bulunmamakta'

Select sorgusunda dönen kayıt sayısını @@ROWCOUNT verdiği için ona göre şart koştuk.
Soru’’
Personeller tablosuna bir isim ve soyisim kaydetmeye çalışın. Eğer bu isim ve soyisimde bir kayıt tabloda  zaten var ise, böyle bir kayıt var desin, yok ise eklesin ve eklendi mesajı versin.


declare @isim nvarchar(50),@soyisim nvarchar(50)
set @isim = 'Gençay'
set @soyisim = 'Yıldız'
select * from Personeller where Adi=@isim and SoyAdi=@soyisim
if @@ROWCOUNT>0
print 'Bu isimden ya da soyisimden veritabanında bulunmaktadır.'
else
insert Personeller(Adi,SoyAdi) values(@isim,@soyisim)

Yukardaki yapıyı ilk çalıştırdığınızda kayıt işlemi yapılacak,ikinci çalıştırdığınızda kayıt işlemi yapılmayacaktır.print ile verilen mesaj gözükecektir.
Not: if ya da else den sonra bir satırdan fazla kod işlenecekse bunları “begin” ve “end” komutları arasına yazmalıyız.C# taki {} scopelarla aynı işi görür.
EXISTS
Bir sorgunun sonucunda geriye tablo dönüyorsa eğer “true”, dönmüyorsa “false” geriye döndüren bir metod gibi düşünülebilir.


if exists(select * from personeller where adi='Gençay')
print 'True'
else
print 'False'

Yukarıda select sorgusu bir tablo dönüyor ve exists metoduda bunu true olarak algılıyor.
WHILE DÖNGÜSÜ
T-SQL de sadece while döngüsü bulunmaktadır.


declare @i int
set @i = 10
while @i>=1
begin
print @i
set @i=@i-1
end

GEÇİCİ TABLOLAR (TEMPORARY TABLES)
Genellikle bir sql server üzerinde farklı lokasyonlarda 1 den fazla kişinin çalıştığı durumlarda ya da verilerin test amaçlı geçici bir yerlerde tutulması,işlenmesi amacıyla kullanılırlar.Bildiğimiz tablo yapısının aynısı sağlarlar,tek farkları fiziksel olarak oluşmazlar.Sadece bellekte geçici olarak oluşturulurlar.Select,insert v.s işlemleri yapılabilir.İlişki kurulabilir.Sunucu kapatıldığında ya da oturum sahibi oturumu kapattığında bellekten silinirler.


select Adi,SoyAdi into otomatiktablo from Personeller

Bu şekilde “otomatiktablo” adında fiziksel bir tablo oluşturulabiliyor.Ve kaç tane kolon çektiysek içinde otomatik olarak o kadar kolon oluşuyor.Sadece primary key,foreign key ler oluşmuyor.


select Adi,Soyadi into #otomatiktablogecici from Personeller

Bu şekilde ise “#” işareti sayesinde “otomatiktablogecici” adında geçici bir tablo oluşturuyor.Fiziksel bir tablo olmuyor.Geçici olarak bellekte oluşur.


select * from #otomatiktablogecici
select Adi from #otomatiktablogecici
select * from #otomatiktablogecici where Adi='Gençay'
insert #otomatiktablogecici(Adi,SoyAdi) values('c','d')
delete from #otomatiktablogecici where Adi='Gençay'
update #otomatiktablogecici set Adi='abc' where Adi='c'

Yukarda gördüğünüz gibi geçici tablo üzerinde her türlü işlemi yapabiliyoruz.
–          # ile oluşturulan tablo,o an sql servarda oturum açmış kişinin sunucu belleğinde oluşur.
–          Sadece oturum açan şahıs kullanabilir.
–          Eğer oturum açan şahıs sql servardan disconnet olursa bu tablo bellekten silinir.


select * into ##otomatiktablogecici2 from Personeller
select * from ##otomatiktablogecici2

Yukarda gördüğünüz gibi iki “##” den başlıyorsa eğer,

–          ## ile oluşturulan tablo,o an sql servarda oturum açmış kişinin sunucu belleğinde oluşur.
–          Bu tabloyu oturum açan şahıs ve onun sql servarına dışardan ulaşan 3. şahıslar kullanabilir.
–          Eğer oturum açan şahıs sql servardan disconnet olursa bu tablo bellekten silinir.
–          Diğer bütün özellikleri # ile oluşturulan tablo ile aynıdır.
UNIQUEIDENTIFIER VERİ TİPİ
Buda aynı int,varchar v.s. gibi bir veri tipidir.Aldığı değer rakamlar ve harflerden oluşan çok büyük bir sayıdır.Bundan dolayı bu kolona aynı değerin birden fazla gelmesi neredeyse imkansızdır.O yüzden tekil bir veri oluşturmak için kullanılır.


create table denemeasd
(
id uniqueidentifier,
adi nvarchar(50),
soyadi nvarchar(50)
)

Yukarda gördüğünüz gibi “id” kolonu “uniqueidentifier” tipindendir.
“NEWID()” fonksiyonunun ürettiği değerde “uniqueidentifier” dir.


insert denemeasd values(NEWID(),'Gençay','Yıldız')
select * from denemeasd
Mobil sürümden çık