1-) MSSQL RMOS - geçici sanal tablo oluşturmak ve procedürden dönen değer ile kullanmak
bir procedüreden sanal tabloya veri aktarmak ve kullanmak
create proc [dbo].[deneme2] as begin
declare @t table(col1 varchar(10), col2 float, col3 float, col4 float,col5 float)
insert @t values('a', 3,3,3,1)
insert @t values('b', 4,4,4,1)
select * from @t
end
--exec deneme2
create table #deneme5(col1 nvarchar(50),col2 int,col3 int, col4 int, col5 int)
insert into #deneme5
exec deneme2
select * from #deneme5
drop table #deneme5
SQL Server developerlarin isini çok kolaylastiran ve kullanimi kolay temporary(geçici) tablo yapisini destekler. Geçici tablolar çalisma aninda olusturulur ayrica normal bir tabloda yapabilecegimiz tüm islemleri temp tablolarda da yapabiliriz. Temp Tablolar tempdb veritabaninda saklanirlar.
Bu makalemiz de temp tablolarin kullanimi ile ilgili giris seviyesinde hizli bir balis atacagiz.
SQL Server iki farkli temp tablo tipi saglar.
Local Temp tablolar sadece tabloyu olusturan kullanicinin, olusturmak için kullandigi connection üzerin de geçerlidir. Kullanici baglantiyi kapattigi anda otomatik olarak silinir. Local Temp tablo tanimlamak için tablo isminin önüne # isareti koymamiz yeterlidir.
Global olarak temp tablo tanimlamak için ## karakterlerini tablo isminden önce eklememiz yeterlidir. Global temp tablolar bir connection içinde tanimlandigi anda, normal tablolar gibi tüm kullanicilar ve connectionlar içinde kullanilabilir hale gelirler. Global tabloyu olusturdugunuz connection kapatilana kadar bu tablo var olmaya devam eder.
Yukarida anlattigimiz iki farkli tipteki temp tablolarin nasil olusturulup kullanilacagini asagidaki örneklere bakarak anlamaya çalisalim
CREATE TABLE #LocalTempTablo
(
ID int,
Ad varchar(20),
Soyad varchar(20)
)
Yukaridaki sorgu ile tempdb içinde bir geçici(temp) tablo olusturmus olduk, normal bir tabloya insert/select yapiyormus gibi temp tabloya da asagidaki gibi insert/select yapabiliriz.
insert into #LocalTempTablo values ( 1, 'Sabri','KUNT');
select * from #LocalTempTablo
ID Ad Soyad
----------- -------------------- --------------------
1 Sabri KUNT
(1 row(s) affected)
Yukariki scriptleri çalistirdiktan baska bir sorgu penceresinde select veya insert sorgusu çalistirirsaniz asagidaki hatayi alirsiniz.
Msg 208, Level 16, State 0, Line 1
Invalid object name '#LocalTempTablo'
Yukaridaki hatanin sebebi, olusturdugumuz temp tablonun sadece olusturuldugu connection içinde geçerli olmasidir.
Global bir temp tablo olusturmak için iki adet # karakteri kullaniyoruz (##). Global temp tablolar olusturuldugu connection aktif oldugu sürece tüm kullanicilar ve connectionlarda kullanilabilir demistir. Bir örnekle daha iyi anlayalim.
CREATE TABLE ##GlobalTempTablo
(
ID int,
Ad varchar(20),
Soyad varchar(20)
)
insert into ##GlobalTempTablo values ( 1, 'Sabri','KUNT');
select * from ##GlobalTempTablo
Yukaridaki select ve insert sorgusunu istediginiz herhangi bir sorgu ekraninda çalistirabilirsiniz. Ilk olusturdugunuz connection açik oldugu sürece heryerden bu tablolara erisim yapilabilir. Bunu kendinizde deneyerek görebilirsiniz.
SQL Server Temp tablolari asagida da görüldügü gibi tempdb veritabanin da tutar.
Büyük veriler ile çalisirken bazen bir sorgu sonucunda dönen kayitlari baska bir sorguda join islemine tabi tutariz. Temp tablo kullanmak yerine iç içe select yazabiliriz fakat bu büyük kayitlarda bazen performans sikintisi ve komplex sqllere sebeb olur. Bu yüzden belirli bir sorgu sonucunu temp bir tabloya atar ve bu tabloyuda baska bir sorguda kullanabiliriz. Bununla ilgili olarak asagidaki örnegi inceleyebilirsiniz.
select
top 100 CustomerKey,FirstName,LastName
into #temp
from dbo.DimCustomer
select
ProductKey,OrderDateKey
,s.CustomerKey,SalesOrderNumber
,UnitPrice from FactInternetSales s
inner join #temp t on s.CustomerKey = t.CustomerKey
Temp tablo olusturmak için alternatif diger yöntem tablo degiskeni tanimlamaktir. Nasil tanimlandigi ve kullanildigini asagida görebilirsiniz.
Declare @TempTableVariable TABLE(
ID int,
Ad varchar(20),
Soyad varchar(20)
)
insert into @TempTableVariable values ( 1, 'Sabri','KUNT');
insert into @TempTableVariable values ( 1, 'Ali','RÜZGAR');
select * from @TempTableVariable
kaynak : http://www.yazilimmutfagi.com/index.php/2012/03/05/sql-server-da-temporary-gecici-tablo-kullanmak/