Temporary Tables (Geçici Tablolar)
23 Aralık 2016 Cuma
Geçici tabloların, database'de yaratmış olduğumuz normal tablolardan(kalıcı tablo) yapı olarak hiçbir farkı yoktur. Geçici tablolarda tıpkı kalıcı tablolarda olduğu gibi SELECT ve INSERT işlemlerine sokulabilirler. Kalıcı tabloları bir kez yaratırsınız ve siz o tabloyu silene dek yaşamaya devam ederler. Öte yandan, geçici tablolar TempDB(System Database altında)'de yaratıldıktan sonra, uzun süre kullanılmaz ise otomatik olarak silinirler.
Geçici tablolar 2'ye ayrılır:
* Local Temporary Tables
* Global Temporary Tables
Biz kalıcı bir tablo yaratırken;
CREATE TABLE kalici_tablo_adi(ID int, Name nvarchar(30))
şeklinde cümleye başlıyoruz..
Local temporary table yaratırkende cümle aynı kalıyor sadece tablo adının başına # işareti geliyor;
CREATE TABLE #gecici_tablo_adi(ID int, Name nvarchar(30))
Geçici tabloların oluşturulduktan sonra barındığı yer; System Databases > tempdb > Temporary Tables yoludur.
ya da
SELECT name FROM tempdb..sysobjects WHERE name like '#gecici_tablo_adi%' şeklindede ulaşılabilir. Burada WHERE koşulundaki LIKE sözcüğünün bir anlamı var. O da şu; SQL Server geçici tablo isimlerinin sonuna random(rastgele) bir sayı atar. Aynı tablo adı da olsa farklı sessionlarda üretilen tablolar birbirleri arasında ayırt edilebilsinler diye bu atama işlemi yapılır. Dolayısıyla sorgu ile geçici tablolara ulaşmak istiyor iseniz bu yöntemi kullanmalısınız. Ayrıca geçici tablo üzerinde işlem(SELECT, INSERT vb) yapabilmeniz için hangi sessionda bu tabloyu yarattı iseniz o session üzerinden bu işlemi yapıyor olmanız gerekir.
Şimdi gelelim geçici tabloların ömürlerine; geçici tablolar ilgili session(new query diyip açtığınız pencereye deniyor) açık kaldığı süre boyunca tempDB altında yaşarlar. Kapattığınız an geçici tablonunda otomatik olarak silindiğini göreceksinizdir. Session'ı kapatmadan ilgili tabloyu silmek isterseniz:
DROP TABLE #gecici_tablo_adi cümlesini yazıyor olmanız gerekir.
Geçici tabloların stored procedure içersinde kullanımı:
Böyle bir durumda stored procedure çalışmasını(Execution) tamamladıktan sonra, geçici tabloda otomatik olarak silinecektir. Ancak ilgili SP yi herhangi bir session'dan çalıştırdığınızda istenilen sonuç size geri dönecektir. Örnek üzerinden inceleyecek olursak:
CREATE PROCEDURE upGeciciTablo
AS
BEGIN
CREATE TABLE #City(Id INT, City NVARCHAR(30))
INSERT INTO #City VALUES(1, 'Ankara')
INSERT INTO #City VALUES(2,'Bursa')
INSERT INTO #City VALUES(3,'Manisa')
SELECT * FROM #City
END
EXEC upGeciciTablo diyip prosedürümüzü çalıştırdığımızda insert değerlerim gelecektir ancak SELECT * FROM #City sorgusu çalışmayacaktır çünkü baştada dediğim gibi prosedür içersindeki geçici tablonun yaşam süresi o prosedür çalışmasını tamamladığında sona erer.
Global Temporary Tables
Local temporary tablo yaratmak için ilgili tablonun başına # işareti koyuyor idik global temporary için 2 adet # işareti koymamız gerekiyor. Ayrıca global tablolara tüm session'lardan erişilebilir. Silinmeleri için açık olan son bağlantının(session) da kapatılması gerekiyor. Ayrıca local geçici tablolarda olduğu tablo sonuna rastsal(random) bir sayı ataması yapılmaz. Bu açıdan bakıldığında farklı session(user)lardan da olsa oluşturulan global tabloya aynı isimle ulaşılabilir. Örnek yazım şekli şöyledir:
CREATE TABLE ##gecici_tablo_adi(ID int, Name nvarchar(30))
Bir sonraki makalemde görüşmek üzere.