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

Eyl 08, 2013
Veritabanı üzerinde geçici bir süre için ek tablolara ihtiyaç duyulduğunda T-SQL ile geçici tablolar oluşturulup, kullanılır. Geçici tablolar, gerçek tablolar üzerinde işlemler yapmak yerine, farklı sorgulamaların yapılabileceği bir deneme tahtası gibi kullanılır. Yani önemli tablolar üzerinde kritik sorgular çalıştırmak zorunda kalındığında ve sonuçlar tahmin edilemeyecek gibiyse, geçici bir tablo oluşturulur ve kodlar bu geçici tablo üzerinde test edilir; daha sonra istenilen kodlar gerçek tabloya uygulanır. Aynı zamanda geçici tablolar, karmaşık ve çok fazla bilgi olan tablolardan sadece belirli bir kısmı alarak üzerinde çalışmak için de kullanılabilir.

Geçici tablolar SQL Server’da tmpdb isimli veritabanının altında saklanırlar. Geçici tablolar, yerel geçici tablolar (local temporary tables) ve genel geçici tablolar (global temporary tables) olmak üzere ikiye ayrılırlar. Yerel geçici tablolar, tabloyu oluşturan kişi SQL Server ile olan bağlantısını kapattığında yok edilir. Genel geçici tablo ise son aktif bağlantı kapatıldığı anda yok edilir. Yani geçici tabloyu oluşturan kişi ile birlikte o anda SQL Server’a birden fazla kişi bağlı bulunabilir. Bu durumda tabloyu oluşturan kişi SQL Server ile olan bağlantısını kapattıktan sonra SQL Server’a bağlı bulunan kimse kalmayana kadar geçici tablo saklanır ve bağlı bulunan en son kişi bağlantısını sonlandırdığında tablo silinir.

Geçici tablolar, normal bir tablo oluşturmak için kullanılan "CREATE TABLE" ifadesi ile  oluşturulurlar. Ancak, tablonun geçici olduğunu SQL Server'a bildirmek için tablo adı önüne "#" işareti eklenir. Bu şekilde oluşturulan tablolar yerel geçici tablolardır ve sadece o oturum için geçerli olup, oturum kapatıldığı andan itibaren veya başka bir sorgu (query) ekranından erişilemezler.

CREATE TABLE #Temporary(
     number INT PRIMARY KEY,
     name NVARCHAR(50),
     surname NVARCHAR(50)
)

Geçici tablolara, başka oturumlar üzerinden veya diğer kullanıcılar tarafından erişimi sağlamak için tablolar, "#" yerine "##" (genel geçici tablo) kullanılarak oluşturulmalıdır. 

CREATE TABLE ##GlobalTemporary(
     number INT PRIMARY KEY,
     name NVARCHAR(50),
     surname NVARCHAR(50)
)

Geçici tablolar oluşturmanın iki yöntemi vardır:

1. yöntem: Oturum boyunca geçerli geçici tablolar oluşturmak için kullanılır. 

CREATE TABLE #tablo_adi(
     Alan1 tur1[(boyut1)] [[NOT] NULL],
     Alan2 tur2[(boyut2)] [[NOT] NULL],
     ...
     Alann turn[(boyutn)] [[NOT] NULL]
)

Oluşturulan geçici tablolar üzerinde normal bir tabloymuş ekleme, silme vs. gibi işlemler yapılabilir. Ancak bu tablolar, oturum kapatıldığında veya SQL Server durdurulduğunda silinir. Bunun dışında tablo "drop" komutu ile de silinebilir.

2. yöntem: Geçici tablo oluşturmanın bir diğer yolu, "tempdb" adlı veritabanı dosyasına bir tablo açmaktır. Bu veritabanındaki tablolar sadece SQL Server kapatıldığında silinir.
Genel yapısı şöyledir:

CREATE TABLE tempdb..tablo_adi(
     Alan1 tur1[(boyut1)] [[NOT] NULL],
     Alan2 tur2[(boyut2)] [[NOT] NULL],
     ...
     Alann turn[(boyutn)] [[NOT] NULL]
)

Bu yöntemle oluşturulan geçici tablolar, SQL Server durdurulduğu anda kaybolur. Çünkü "tempdb" adlı veritabanı SQL Server açıldığı anda boş bir hale getirilecektir. Bazen kullanıcı çıkış yaptığı halde geçici tablonun saklanması ihtiyacı olabilir. Bu tür durumlarda, geçici tablo SQL Server kapanıncaya kadar hafızada kalıp, SQL Server kapatıldığında silinecekse, "tempdb" veritabanında tablo açma yöntemi kullanılabilir.

Geçici tabloların özellikleri:
  • Saklı yordam (Stored Procedure) içerisinde geçici tablo kullanılabilir; ancak, kullanıcı tanımlı fonksiyon (User Defined Function - UDF) içerisinde geçici tablo yaratılamaz.
  • Normal tablolarda olduğu gibi geçici tablolarda da indeks (index) oluşturabilir ve kimlik (identity) alan tanımlanabilir.
  • Geçici tabloların farklı kullanıcılar tarafından aynı anda oluşturulma ihtimalleri vardır. Bu durumda sistem kendilerine benzersiz (unique) bir id ataması yaparak isim çakışmalarını engeller.