Sql Serverda sorgu sonucu aldıgınız verileri biyerde nasıl depolarsınız sorusuna genelde gelen ilk cevap Temp Table oluştururum şeklinde olur Sql 2000 den gelen en klasik kullanma yöntemidir aslında bu.
Ama birçoğumuz Sql 2005 in yeni bir özelliğini bilmediginden bu ekilde kullanmaya devam ediyoruz.
Bu yeni özelliğimiz Sql Serverin Table tipinde bir veri yapısı saglaması.
Sql 200 de Temp Db lerde söle kullanırız
SELECT * INTO #TempDB FROM
(
Select * from Contact
)
DROP TABLE #TempDB
burda drop table i unutmamız ciddi performans sorunları çıkartır.
#TempDB yapısında aldıgı sorgu sonucunu harddikste biyere yazması yatar aslında .
Bunun Alternatifi ise artık Table tipinde değiken
peki en büyük artısı ne
1-Harddiske değil memory'e yazıyor verileriBöylece hızı epey artıyor.(Hepinizin gözlerinin parladıgına eminim :) )
2- Drop Table yazmamız gerekmiyor
3. Store procedurlerle kullandıgında yeniden derlemeye gerek kalmıyor
Dezavantajlarıda var tabi
1. Nekadar büyük data atarsanız okadar memory den yemeye başlar.Performans sistem kaynaklarınıza göre tam tersi sonucta verebilir.
2. İndex koyamıyoruz
Peki nasıl kullanırız
DECLARE @ContactTable TABLE(Ad NVARCHAR(255),Soyad NVARCHAR(255))
INSERT INTO @reportTable
SELECT Ad,Soyad from Contact
select * from @ContactTable
-------------------------------------------
MSDN den bir örnek
USE AdventureWorks;
GO
DECLARE @MyTableVar table(
EmpID int NOT NULL,
OldVacationHours int,
NewVacationHours int,
ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25
OUTPUT INSERTED.EmployeeID,
DELETED.VacationHours,
INSERTED.VacationHours,
INSERTED.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
--Note that ModifiedDate reflects the value generated by an
--AFTER UPDATE trigger.
SELECT TOP (10) EmployeeID, VacationHours, ModifiedDate
FROM HumanResources.Employee;