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
|