Hoþgeldiniz           
   
"SQL Server baþvuru kaynaðýnýz"
Skip Navigation Links
=========
Anasayfa
Makaleler
Hatalar \ Çözümler
Duyurular
Diðer
Ýpuçlarý
Yararlý Adresler
Mesaj TahtasýExpand Mesaj Tahtasý
HakkýmdaExpand Hakkýmda
Ýletiþim
Kullanýcý Adý:
Þifre:
 

Ne Mutlu Türküm Diyene!

SQL Server ile ilgili soru sormak için buraya týklayýn!


Yazýlarýmý nasýl buluyorunuz?






En Son SQL Server ile Ýlgili Okuduðum Kitaplar
- Inside Microsoft SQL Server 2005: Query Tuning and Optimization - MS Press (Ýngilizce)
- Accelerated SQL Server 2008 - Apress (Ýngilizce)
- Designing and Optimizing Data Access by Using SQL Server 2005 - MS Press (Ýngilizce)
- Microsoft SQL Server 2005 Database Solutions Design - Wiley Publishing (Ýngilizce)- Optimizing and Maintaining a Database Administration Solution by Using SQL Server 2005 - MS Press (Ýngilizce)- Designing a Database Server Infrastructure Using SQL Server 2005 - MS Press (Ýngilizce)- SQL Server 2005 Implementation and Maintenance - MS Press (Ýngilizce)
- SQL Server 2005 Administrators Companion - MS Press (Ýngilizce)


              
SQL Server 2008: Table Valued Parameters

Son güncelleme tarihi: 30 Ocak 2008



Merhaba arkadaþlar,


"Tablo-deðerli parametreler" SQL Server 2008 ile birlikte gelen bir yeniliktir. "Tablo-deðerli parametreler", User-Defined Table Type (Kullanýcý Tanýmlý Tablo Tipi) kullanýlarak tanýmlanýr. "Tablo-deðerli parametreler" ý Stored Procedure ya da Function' lara geçiçi tablo kullanmadan çoklu kayýt göndermek için kullanabilirsiniz.

Þunu da yazýmýn baþýnda hemen söyleyeyim, bu yazýyý hazýrlarken kullandýðým SQL Server 2008 versiyonu CTP5 versiyonudur. RTM versiyonunda deðiþiklikler olabilir. Bunu þu anda bilmek imkânsýz. Bu nedenle daha sonra SQL Server 2008 ile ilgili bu ve diðer yazdýðým makaleler ile kullanacaðýnýz SQL Server 2008 RTM versiyonu arasýnda uyuþmazlýk olursa kýzmayýn bana =)

Konunun örneklerle ve deneyerek daha iyi anlaþýlacaðýný düþündüðüm için yazýma bir örnekle devam etmek istiyorum. Meselâ SQL Server 2005 ve öncesinde bir Stored Procedure kullanarak bir kerede birden çok kayýt girmek istediðimizde ne yaptýðýmýzý hatýrlayalým. Örneði yapmak için aþaðýdaki kodlarý SQL Server Query Editor \ Query Analyzer' a kopyalayýp yapýþtýrarak çalýþtýrýn ve örneðimiz için gereken yapýyý oluþturmuþ olun.

Örnek Veritabaný:
CREATE DATABASE DenemeDB

Örnek Tablo:
USE DenemeDB
GO

CREATE TABLE
dbo.Personeller(PersonelID int NOT NULL, PersonelAdi nvarchar(100) NOT NULL, PersonelEposta nvarchar(100) NOT NULL)

Örnek Stored Procedure:
USE DenemeDB
GO

CREATE PROCEDURE
YeniPersonel
( @PersonelID int,
  @PersonelAdi nvarchar(100),
  @PersonelEposta nvarchar(100) )
AS
BEGIN
INSERT INTO
dbo.Personeller VALUES(@PersonelID, @PersonelAdi, @PersonelEposta)
END

Eðer yukarýda örnek kodlarý bulunan veritabanýný, tabloyu ve Stored Procedure' ü oluþturduysanýz, þimdi de tablomuzun içine Stored Procedure' ümüzü kullanarak bir kaç kayýt girelim.

Örnek Kayýtlar:
USE DenemeDB
GO

EXECUTE YeniPersonel 1,'Fatma Gözüdönmüþ','fatmag@xxx.com'
EXECUTE YeniPersonel 2,'Ali Sakat','alis@xxx.com'
EXECUTE YeniPersonel 3,'Yasemin Yeter','yaseminy@xxx.com'

Örnek Kayýtlarý Sorgula:
USE DenemeDB
GO
SELECT * FROM Personeller

Ýþte SQL Server 2008 öncesinde birden fazla kayýt girmemiz gerektiðinde (genelde) yaptýðýmýz þey buydu. Tablo-deðerli parametreler ile karþýlaþtýrýldýðýnda bu yöntemin aþaðýdaki gibi bazý eksileri var:

- Birden çok kere gidip gelme (Round Trip)
- Stored Procedure' ün birden fazla çalýþtýrýlmasý
- Verimsiz kodlama

Ayný sonucu bir de Tablo-deðerli parametreler kullanarak almayý deneyelim. Ama önce, yeni örneðimiz için de kullanacak olduðumuz "Personeller" isimli tablomuzdaki kayýtlarý aþaðýdaki kodu kullanarak temizleyelim.

"Personeller" Tablosunu Temizle:
USE
DenemeDB
GO

TRUNCATE TABLE dbo.Personeller

Þimdi temiz bir "Personeller" tablomuz var. Tablo-deðerli parametrelerimizi bir User Defined Table Type tanýmlayarak oluþturalým:

Used Defined Table Type:
CREATE TYPE PersonellerTableType AS TABLE (PersonelID INT, PersonelAdi nvarchar(100), PersonelEposta nvarchar(100));
GO

Bu kodu çalýþtýrdýktan sonra "DenemeDB" veritabanýnýz içerisindeki Programmability\Types\User-Defined Table Type içerisinde Resim-1' deki gibi "PersonellerTableType" adýnda bir User Defined Table Type göreceksiniz.


Resim-1

Þimdi "PersonellerTableType" adlý bu User Defined Table Type' ý kullanarak veri kaydedeceðimiz Stored Procedure' ümüzü oluþturalým. Yalnýz þuna dikkatinizi çekmek istiyorum ki bu Stored Procedure' ün adýný bir önceki örnekte oluþturduðumuz Stored Procedure ile karýþtýrýlmasýn diye özellikle "YeniPersonel08" yaptým. "YeniPersonel08" isimli Stored Procedure' ü oluþturmak için aþaðýdaki kodu çalýþtýrýn:

Örnek Stored Procedure:
USE DenemeDB
GO

CREATE PROCEDURE
YeniPersonel08
( @PersonelBilgileri PersonellerTableType READONLY)
AS
BEGIN
INSERT INTO
dbo.Personeller SELECT * FROM @PersonelBilgileri
END

Stored Procedure de oluþturulduktan sonra sýra veri girmede. Aþaðýdaki kodu kullanarak ve tabii User Defined Table Type marifetiyle veri giriþi yapmýþ olacaðýz:

Örnek Kayýt Giriþi:
USE
DenemeDB
GO
DECLARE @YeniPersonel PersonellerTableType
INSERT INTO @YeniPersonel VALUES(1,'Zeynep Yamalý','zeynepy@xxx.com')
INSERT INTO @YeniPersonel VALUES(2,'Zeydi Kaçar','zeydik@xxx.com')
INSERT INTO @YeniPersonel VALUES(3,'Mehmet Tanrýverdi','mehmett@xxx.com')
EXECUTE YeniPersonel08 @YeniPersonel
GO

"YeniPersonel" isminde bir deðiþken tanýmladýk ve veri tipini de daha önceden oluþturmuþ olduðumuz "PersonellerTableType" olarak verdik. Daha sonra tanýmladýðýmýz bu deðiþken içerisine eklemek istediðimiz kayýtlarý INSERT INTO komutunu kullanarak sunucuya tekrar tekrar gidip gelmeden ekledik. Daha sonra tek seferde bu üç kaydý da "YeniPersonel08" ismiyle oluþturmuþ olduðumuz Stored Procedure' ü kullanarak tek seferde veritabanýmýza kaydettik. Bunu söylemeye gerek var mý ya da yok mu tam bilemiyorum, ama komutun çalýþmasý tamamlandýktan sonra deðiþkene atadýðýnýz deðerler otomatik olarak silinecektir.

Bunu daha önceden þu ve bu þekilde yapýyorduk zaten diyenleriniz olabilir. Fakat SQL Server ile bütünleþik þekilde ve bu kadar kolay bir þekilde böyle bir özellik yoktu. Oldukça kullanýþlý olduðuna inandýðým bir yenilik. Benim çok hoþuma gitti, umarým siz de beðenirsiniz.

Kaynaklar:
Bu makaleyi hazýrlarken Microsoft Virtual Labs dokümanlarýndan yararlandým.

 

Ekrem Önsoy

 

Anasayfa


 
Bu sitenin tüm haklarý, Ekrem Önsoy' a aittir.