Table Variables etiketine sahip kayıtlar gösteriliyor.
Table Variables etiketine sahip kayıtlar gösteriliyor.

SQL'de Temporary (Geçici) ve Değişken (Variable) Tabloların Kullanımı

SQL'de oluşturulan geçici tablolar, kullanıcıya ait olan veritabanında tutulmazlar. SQL Server’da tempdb içinde tutulurlar. Bu tempdb sisteme ait bir veritabanıdır. tempdb geçici tabloları tuttuğu gibi aynı zamanda SQL Server üzerinde çalıştırılan sorgular sonucu arka planda tablosal işlemlerin yapıldığı ve verilerin bizim ekranımızda geçici olarak oluşturulduğu yapınında gerçekleşmesini sağlarlar. SQL'de Temporary tablo oluştururken iki seçeneğimiz bulunmakta. Bunlar kullanım şeklinize göre farklılık gösterebilir.
  • Geçici Tablolar (Temporary Tables)
  • Değişken Tablolar (Table Variables)
Geçici Tablolar (Temporary Tables)
Geçici tabloları oluşturmak için de tıpkı normal bir tabloyu oluşturmakta kullandığımız "CREATE TABLE" ifadesini kullanırız. Fakat oluşturulan tablonun gerçek bir tablo mu yoksa geçici bir tablo mu olduğunun ayırt edilmesi için; oluşturduğumuz tablonun sanal bir tablo olduğunu SQL'e "#" işaretini kullanarak bildiririz. 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. SQL Serverda geçici tablolara sadece bulundukları ortamlardan erişilebilir. Temp Tabloların normal tablolardan en önemli farkı bir System Database olan tempdb içinde tutuluyor olmalarıdır.

Eğer temp table'a global olarak diğer ortamlardan da erişilmesini istiyorsak o zaman global temp table kullanmamız gerekmektedir. Global Temporary Tables (Genel geçici tablolar) tanımlamak için temp table dan farklı olarak CREATE TABLE dediktenden sonra tablomuzun ismini vermeden önce "##" işaretini 2 adet kullanarak bildirim yaparız. Global Temporary Tables'ın bütün özellikleri temp table ile aynıdır.

Genel Yapısı:
CREATE TABLE #TabloAdı (kolon1 veritipi, kolon2 veritipi)
--Local Temporary Table için "#" Global Temporary Table için "##" kullanılmalıdır.

Geçici tablolar tıpkı normal tablolar gibi oluşturulurlar sadece önlerinde "#" işareti farkı vardır. 

Örnek:
CREATE TABLE ##Musteriler(MusteriID NCHAR(5), MusteriAdSoyad NVARCHAR(30),
MusteriSehir NVARCHAR(15));
INSERT INTO ##Musteriler(MusteriID,MusteriAdSoyad,MusteriSehir)
SELECT Customers.CustomerID, ContactName, City
FROM Customers


Örneğimizde ##Musteriler adında bir Global Temporary Table oluşturduk. Query bağlantısında Northwind Database Customers tablosu örneklendi. Resimde görüldüğü gibi aktif database "BAYRAKTAR" olmasına rağmen global bir temporary table oluşturduğumuz için "select *  from ##Musteriler" ile listeleme yaptığımızda verilerin listelendiğini görüyoruz.

SQL Serverda "#" ile başlayan tablolar SQL Server durduğu ana kadar saklanır. Fakat tablolarımızı tempdb altına kendimiz normal tablo ekler gibi eklersek tablolarımız SQL Server kapatılana kadar orda saklanır. SQL Server kapatıldığında temp tablolarımızın silinmesini istiyorsak:
DROP TABLE #TemporaryTable

Temporary Tablolar Nerede ve Ne Amaçla Kullanılır?
Büyük veritabanları ile çalışırken bir sorgu sonucunda dönen kayıtları başka bir sorguda join işlemine tabi tutmak isteyebiliriz. Temporary Table kullanmak yerine iç içe SELECT sorguları yazılabilir ancak bu büyük kayıtlarda SQL Server üzerinde performans sıkıntısına neden olur. Bu nedenle belirli bir sorgu sonucunu Temporary bir tabloya atmak ve bu tabloyuda başka bir sorguda kullanabiliriz.

Değişken Tablolar (Table Variables)
Değişken tablolarda aslında geçici tablolara benzemektedir. Farkı oluşturduğumuz tablonun bir kısmı tempdb de bir kısmıda Sunucu olarak kullanıdığımız SQL Server belleğinde tutulmaktadır. Oluşturduğumuz tablo isminin başına "@" işareti koyarız. Değişken tablolara erişim temporary tablolara göre daha hızlıdır. Fakat değişken tablolara fazla veri yüklemek belleği dolduracağından performans kaybına yol açabilir. Değişken tabloların Temporary tablolardan en önemli farkı kullanıcı tanımlı fonksiyonlar (User Defined Functions) içinde kullanılabilmeleridir.

Genel Yapısı:
DECLARE @TabloAdı TABLE (kolon1 veritipi, kolon2 veritipi)
  • Değişken Tablolar tıpkı Temporary Tablolar gibi oluşturulurlar önlerinde "@" işareti farkı vardır. 
  • Değişken Tablolar üzerinde index tanımı yapamayız fakat geçici tablolar üzerinde yapabiliriz. 
  • Değişken tablolar üzerinde ALTER TABLE komutunu kullanamayız, yani bu şekilde oluşturulan bir tabloda ALTER TABLE işlemi yapılamıyor. Bu tipteki bir yapı çok fazla veri içermeyecek tablolar için uygundur.
Örnek:
DECLARE @Musteriler TABLE
(MusteriID NCHAR(5), MusteriAdSoyad NVARCHAR(30), MusteriSehir NVARCHAR(15))
INSERT INTO @Musteriler(MusteriID,MusteriAdSoyad,MusteriSehir)
SELECT Customers.CustomerID, ContactName, City
FROM Customers