"In Line Table Valued" fonksiyonlar geriye bir tablo döner ve gövdesinde sadece "select" sorguları kullanılır demiştik. "User Defined" fonksiyonların sonuncusu olan "Multistatement Table Valued" (çoklu durum tablo değerli) fonksiyonları da geriye bir tablo döner. Fakat adından da anlaşılacağı üzere tanımlanırken gövdesinde DML dilinin tüm sorgularını (select, insert, update, delete) tümünü kullanabilir. Bunu yaparken de gövdesinin "begin-end" skopları arasında olması şarttır. "RETURNS" ifadesinden sonra geriye döndüreceği geçici bir tablo tanımlanır, tip olarak da "TABLE" tipi belirtilir. Bu yüzden en sonda "RETURN" 'den sonra bir şey yazmama gerek kalmaz. Bu tablonun kolonları tipleriyle birlikte tanımlanır. Tanımladığım bu tablo remde geçici olarak tutulur.
Örneğin bir fonksiyonumuz olsun. Parametre olarak verdiğimiz "ad" yada "soyad" 'a göre "Employees" tablosundan veriler çeksin. "Select" ile çektiği veriler aynı zamanda belirttiğimiz geçici tabloma da "insert" etsin. Burada dikkat edilmesi gereken nokta tabloma ekleyeceğim verilerin, tablomun sütün sayısına ve sütunlarımın tiplerine uygun olması gerektiğidir.
CREATE FUNCTION Kisilerim(@tip
nvarchar(7))
RETURNS @Tablom TABLE
(Id INT,Isim NVARCHAR(50))
AS
BEGIN
IF(@tip='ad')
BEGIN
INSERT @Tablom SELECT EmployeeID,FirstName
FROM dbo.Employees
END
ELSE IF(@tip='adsoyad')
BEGIN
INSERT @Tablom SELECT EmployeeID,FirstName+' '+LastName AS Isim
FROM dbo.Employees
END
RETURN
END
Fonksiyonum "Object Explorer" penceresinde "Nortwind" veritabanının altında "Programmability", "Functions", "Table-valued Functions" sekmesi altında yerini aldı. Fonksiyonumu kullanırken "Scalar" fonksiyonlarımdaki gibi "dbo" kullanmama gerek yoktur. İki sütunluk bir tablo döndürmek istediğim için "select" ile çağırıp istediği kolonları içerisinden çekebilirim.
Örneğin ben tabloma kayıt girmeye çalışsam veya bir kaydımı silmeye çalışırsam "Employees" tablomda bir değişiklik olur mu?
ALTER FUNCTION Kisilerim(@tip
nvarchar(7))
RETURNS @Tablom TABLE
(Id INT,Isim NVARCHAR(50))
AS
BEGIN
IF(@tip='ad')
BEGIN
INSERT @Tablom SELECT EmployeeID,FirstName
FROM dbo.Employees
END
ELSE IF(@tip='adsoyad')
BEGIN
INSERT @Tablom SELECT EmployeeID,FirstName+' '+LastName AS Isim
FROM dbo.Employees
DELETE FROM @Tablom WHERE Id=11
END
RETURN
END
Hayır arkadaşlar, "Employees" tablomda bir değişiklik olmaz. Fonksiyonumun tanımını değiştirirken geçici tablom üzerinde bir silme işlemi yaptığımdan dolayı, tablomu "select" ettiğimde bilgileri sadece filtreleyerek gösterecektir. Aşağıda görüldüğü üzere orjinal bilgi "Employees" tablomdadır.
SELECT * FROM Kisilerim('adsoyad') SELECT * FROM dbo.Employees
Başka bir yazıda görüşmek dileğiyle, hoşçakalın...
Hiç yorum yok:
Yorum Gönder