T-SQL’de Geçici Tablo (Temporary Tables) Kullanımı

Geçtiğimiz günlerde yaptığımız bir entegrasyon sonrası bize gönderilen viewi joinleyerek kullanmamız gerekti. Ancak gelen view birçok tablodan data çektiği için birde viewi joinleyerek bir kaç kez kullanmak istediğimizde sorgunun dönüşü çok uzun zaman aldı. Bu sorunu T-SQL de sanal tablo oluşturarak sorunsuz bir şekilde aştık.

Geçici tabloları oluşturmak için de tıpkı normal bir tabloyu oluşturmakta kullandığımız “CREATE TABLE” ifadesini kullanırız. Ancak bu oluşturulan tablonun gerçek bir tablo mu yoksa geçici bir tablo mu olduğunun ayırt edilmesi gerekmektedir. Oluşturduğumuz tablonun sanal bir tablo olduğunu SQL e bildirmek için “#” işaretini kullanmamız gerekmektedir. CREATE TABLE ifadesinden sonra yazılan tablo isminin başına “#” işaretini eklediğimizde SQL bu tablonun geçici bir tablo olduğunu algılar ve oluşturulan tabloyu yalnızca ilgili oturum için geçerli kılar. Oturum kapatıldıktan sonra veya bir başka query ekranı açıldığında bu tabloya erişilemez.

Bir örnek üzerinden gitmek gerekirse:

SICIL ADI SOYADI ADRES TELEFON AMIRSICIL
1 EMRE KANBER KÜTAHYA 4537689 NULL
2 ANIL GÜR MANİSA 9874532 1
3 MUSTAFA ÇOBAN ÇANAKKALE 3427689 2

tablosunu kullanarak tabloyu sanal tabloya atıp onun üzerinde işlem yapacak bir sorgu oluşturalım. Yukarıdaki tablomuzun adı dbo.personel olsun. Yapamız gereken dbo.personel tablosunu bir temp tabloya atıp bu tabloyu kendisi ile joinleyerek kişilerin amirlerinin bilgilerine ulaşmak olsun.

Temp tabloyu oluşturmak için:

CREATE TABLE #personeltmp (
SICIL INT PRIMARY KEY,
ADISOYADI NVARCHAR(250),
ADRES NVARCHAR(250),
TELEFON NVARCHAR(250),
AMIRSICIL INT
)

sorgusunu kullanabiliriz. CREATE TABLE ifadesinden sonra başına “#” işaretini koyarak #personeltmp geçici tablomuzun adını verip parantezler içerisinde de tablomuzun kolonlarını tanımlayarak geçici tablomuzu oluşturmuş olduk.

INSERT INTO dbo.#personeltmp ( [SICIL], [ADISOYADI], [ADRES], [TELEFON], [AMIRSICIL] ) (SELECT * FROM dbo.personel)

sorgusu ile oluşturduğumuz temp tabloyu doldurmuş olduk. Bu işlem sonrasında dbo.personeltmp tablosunu istediğimiz sorgu içerisinde kullanabiliriz, ama yalnızca geçerili query için 🙂

SELECT
A.SICIL AS SICIL,
A.ADSOYAD AS ADSOYAD,
A.ADRES AS ADRES,
A.AMIRSICIL AS AMIRSICIL,
B.ADSOYAD AS AMIRADSOYAD,
B.ADRES AS AMIRADRES
FROM dbo.#personeltmp AS A LEFT JOIN dbo.#personeltmp AS B ON A.SICIL = B.AMIRSICIL

Örnek olarak yukarıdaki sorguyu Execute ettiğimizde bize dönecek olan sonuç şu şekilde olacaktır:

SICIL ADSOYAD ADRES AMIRSICIL AMIRADSOYAD AMIRADRES
1 EMREKANBER KÜTAHYA NULL NULL NULL
2 ANILGÜR MANİSA 1 EMREKANBER KÜTAHYA
3 MUSTAFAÇOBAN ÇANAKKALE 2 ANIL GÜR MANİSA