Tablo değerli fonksiyonlar oluşturma

Tamamlandı

Tablo değerli işlevler , karmaşık sorgu mantığını sonuç kümeleri döndüren yeniden kullanılabilir bileşenler halinde kapsüllemenizi sağlar. Bu işlevleri tablolar veya görünümler gibi doğrudan sorgularda çağırarak kodunuzu daha modüler ve sürdürülebilir hale getirebilirsiniz.

Veritabanı uygulamaları oluştururken genellikle giriş parametrelerine göre filtrelenmiş veya hesaplanan veri kümelerini almanız gerekir. Tablo değerli işlevler, sorgu mantığını parametreleri kabul eden ve tablo döndüren işlevler halinde paketleyerek bu sorunu çözer. Saklı yordamlardan farklı olarak, tablo değerli işlevleri JOIN yan tümcelerinde ve SELECT deyimlerinde kullanarak işlev sonuçlarını veri kaynağı olarak değerlendirme esnekliği elde edersiniz.

Tablo değerli işlev türlerini anlama

SQL Server, her biri farklı senaryolar için uygun olan iki tür tablo değerli işlev sağlar.

Satır içi tablo değerli fonksiyon

Tek SELECT deyim içerir ve sonuçları doğrudan getirir. Satır içi işlevlerde tablo yapısını tanımlamazsınız; SQL Server bunu deyiminizden SELECT çıkartır. Sorgu iyileştiricisi, görünümler gibi satır içi tablo değerli işlevleri parametrelerle değerlendirir ve genellikle daha iyi yürütme planları oluşturur.

Çok deyimli tablo değerli fonksiyon

Bir BEGIN...END blok kullanır ve döndürülen tablonun yapısını açıkça bildirir. Bu tür, birden çok deyim yürütmeniz, karmaşık hesaplamalar yapmanız veya sonuç kümesini yinelemeli olarak derlemeniz gerektiğinde size daha fazla denetim sağlar. Ancak bu esneklik, optimizasyon aracı bu işlevleri farklı şekilde ele aldığı için bir performans karşılığı ile birlikte gelir.

Bu işlevler arasındaki seçim, özel gereksinimlerinize bağlıdır. Parametreleri olan basit sorgular için satır içi işlevler daha iyi performans sağlar. Sonuç kümenizi oluşturmak için yordamsal mantığa veya birden çok adıma ihtiyacınız olduğunda, çok deyimli işlevler gerekli hale gelir.

Satır içi tablo değerli işlevler oluşturma

Satır içi tablo değerli işlevler sorguları parametreleştirmek için kısa bir yol sunar. Bunları tek bir RETURN deyimiyle ve ardından select sorgusuyla tanımlarsınız.

Aşağıdaki örnekte, belirli bir müşterinin siparişlerini alan satır içi bir işlev gösterilmektedir:

CREATE FUNCTION dbo.GetCustomerOrders
(
    @CustomerID INT
)
RETURNS TABLE
AS
RETURN
(
    SELECT 
        OrderID,
        OrderDate,
        TotalAmount,
        Status
    FROM Sales.Orders
    WHERE CustomerID = @CustomerID
);

Bu işlevi artık sorgularda tıpkı bir tablo gibi kullanabilirsiniz:

SELECT OrderID, OrderDate, TotalAmount
FROM dbo.GetCustomerOrders(1001)
WHERE OrderDate >= '2024-01-01';

İşlev, müşteri kimliği parametresini kabul eder ve yalnızca müşterinin siparişlerini döndürür. Gerektiğinde sonuçları daha fazla filtreleyebilir JOINveya toplayabilirsiniz. Bu yaklaşım, müşteri filtreleme mantığını kapsüllerken ana sorgunuzu temiz tutar.

Birden çok ifade içeren tablo döndüren işlevler oluşturma

Çoklu deyimli tablo değerli işlevler, sonuç kümenizi oluşturmak için birden çok işlem gerçekleştirmeniz gerektiğinde daha fazla esneklik sağlar.

Birden çok toplama ile ürün satış özetlerini hesaplayan bir işlev düşünün:

CREATE FUNCTION dbo.GetProductSalesSummary
(
    @StartDate DATE,
    @EndDate DATE
)
RETURNS @SalesSummary TABLE
(
    ProductID INT,
    ProductName NVARCHAR(100),
    TotalQuantity INT,
    TotalRevenue DECIMAL(18,2),
    AveragePrice DECIMAL(18,2)
)
AS
BEGIN
    INSERT INTO @SalesSummary
    SELECT 
        p.ProductID,
        p.ProductName,
        SUM(od.Quantity) AS TotalQuantity,
        SUM(od.Quantity * od.UnitPrice) AS TotalRevenue,
        AVG(od.UnitPrice) AS AveragePrice
    FROM Production.Products p
    INNER JOIN Sales.OrderDetails od ON p.ProductID = od.ProductID
    INNER JOIN Sales.Orders o ON od.OrderID = o.OrderID
    WHERE o.OrderDate BETWEEN @StartDate AND @EndDate
    GROUP BY p.ProductID, p.ProductName;
    
    RETURN;
END;

Tablo değişkenini @SalesSummary belirli sütunlar ve veri türleriyle açıkça nasıl bildirdiğinize dikkat edin. İşlev gövdesi bu tablo değişkenine veri ekler ve ardından döndürür. Bu yapı gerektiğinde ek işleme mantığı, hata işleme veya koşullu deyimler eklemenize olanak tanır.

Sorgularda tablo-değerli fonksiyonları kullanma

Tablo değerli işlevler sorgularınıza sorunsuzca entegre olur, güçlü veri alma desenleri sağlar.

İşlev sonuçlarını diğer tablolarla birleştirebilirsiniz:

SELECT 
    c.CustomerName,
    s.ProductName,
    s.TotalRevenue
FROM Customers c
CROSS APPLY dbo.GetProductSalesSummary('2024-01-01', '2024-12-31') s
WHERE s.TotalRevenue > 10000
ORDER BY s.TotalRevenue DESC;

İşleç CROSS APPLY , Customers tablosundaki her satır için işlevi çağırır, ancak bu örnekte işlev parametreleri sabittir. Sütun değerlerini parametreler olarak geçtiğinizde, CROSS APPLY özellikle kullanışlı hale gelir.

SELECT 
    c.CustomerName,
    o.OrderID,
    o.TotalAmount
FROM Customers c
CROSS APPLY dbo.GetCustomerOrders(c.CustomerID) o
WHERE o.Status = 'Completed';

Bu sorgu, her müşteri için tamamlanan tüm siparişleri alır ve tablo değerli işlevlerin sorgularınız içinde satır satır işlemeyi nasıl etkinleştirdiği gösterilir. işlevi bağıntılı bir alt sorgu işlevi görür ancak daha iyi okunabilirlik ve yeniden kullanılabilirlik sağlar.

Satır satır değerlendirme gerektirmeyen satır içi tablo değerli işlevler için INNER JOIN söz dizimini de kullanabilirsiniz.

SELECT 
    c.CustomerName,
    o.OrderDate,
    o.TotalAmount
FROM Customers c
INNER JOIN dbo.GetCustomerOrders(c.CustomerID) o ON 1=1
WHERE YEAR(o.OrderDate) = 2024;

Bu tekniklerle, daha basit, test edilmiş işlev bileşenlerinden karmaşık sorgular oluşturarak hem kod sürdürülebilirliğini hem de geliştirme verimliliğini geliştirebilirsiniz.