Skaler işlevler oluşturma

Tamamlandı

Skaler işlevler , SQL Server'da yeniden kullanılabilir mantığı kapsüllemenize ve tek bir değer döndürmenize olanak sağlayan temel araçlardır. Bunları doğrudan SELECT deyimler, WHERE yan tümceler ve diğer T-SQL ifadelerinde kullanarak sorgularınızı daha sürdürülebilir ve kodunuzu daha modüler hale getirebilirsiniz.

Skaler işlev temellerini anlama

Skaler işlev sıfır veya daha fazla parametre kabul eder ve belirtilen veri türünün tek bir değerini döndürür. Saklı yordamlardan farklı olarak skaler işlevler, sütun veya değişken kullanacağınız her yere doğrudan SQL ifadelerine eklenebilir.

Skaler işlevlerin temel özellikleri giriş parametrelerini kabul etme, hesaplamalar veya dönüştürmeler yapma ve tam olarak bir değer döndürme özelliklerini içerir. Dönüş veri türünü, SQL Server'ın oluşturma zamanında doğruladığı işlev tanımında açıkça tanımlarsınız.

Skaler bir işlev oluşturduğunuzda, diğer geliştiricilerin veritabanı genelinde çağırabileceği yeniden kullanılabilir bir mantık parçası oluşturursunuz. Bu, kodun yeniden kullanılmasını teşvik eder ve uygulamalarınızda tutarlılığın korunmasına yardımcı olur.

Skaler işlev söz dizimlerini tanımlama

Skaler bir işlev oluşturmak için, belirli söz dizimi bileşenleriyle CREATE FUNCTION deyimini kullanırsınız. Temel yapı işlev adını, parametreleri, dönüş türünü ve işlev gövdesini içerir.

Temel söz dizimi düzeni aşağıdadır:

CREATE FUNCTION schema_name.function_name 
(
    @parameter1 datatype,
    @parameter2 datatype
)
RETURNS return_datatype
AS
BEGIN
    -- Function logic here
    RETURN @result
END

RETURNS yan tümcesi işlevin döndürdüğü tek değerin veri türünü belirtir. Bloğun içinde BEGIN...END T-SQL mantığınızı yazar ve sonucu geri göndermek için bir RETURN deyimi kullanırsınız.

Örneğin, satış vergisini hesaplayan basit bir işlev oluşturabilirsiniz:

CREATE FUNCTION dbo.CalculateSalesTax
(
    @Amount DECIMAL(10,2),
    @TaxRate DECIMAL(5,4)
)
RETURNS DECIMAL(10,2)
AS
BEGIN
    DECLARE @TaxAmount DECIMAL(10,2)
    SET @TaxAmount = @Amount * @TaxRate
    RETURN @TaxAmount
END

Bu işlev iki parametre kabul eder ve hesaplanan vergi tutarını döndürür. Bu işlevi herhangi bir SELECT deyimde kullanabilirsiniz.

İş mantığı ile skaler işlevleri uygulama

Skaler işlevler, veritabanınıza tutarlı bir şekilde uygulamak için ihtiyacınız olan iş kurallarını ve hesaplamaları kapsülleme konusunda mükemmeldir. Skaler işlevlerle, aksi takdirde birden çok sorguda veya uygulama kodunda yinelenebilen mantığı merkezileştirirsiniz.

Çalışan sürelerini yıl olarak hesaplamanız gereken bir senaryo düşünün. İşe alma tarihini kabul eden ve tam yıl sayısını döndüren bir skaler işlev oluşturursunuz:

CREATE FUNCTION dbo.GetEmployeeTenure
(
    @HireDate DATE
)
RETURNS INT
AS
BEGIN
    DECLARE @Tenure INT
    SET @Tenure = DATEDIFF(YEAR, @HireDate, GETDATE())
    RETURN @Tenure
END

Bu işlevi, kullanım süresi bilgilerini görüntülemek için sorgularda kullanabilirsiniz:

SELECT 
    EmployeeName,
    HireDate,
    dbo.GetEmployeeTenure(HireDate) AS YearsOfService
FROM Employees
WHERE dbo.GetEmployeeTenure(HireDate) >= 5

Bu yaklaşım, veritabanınız genelinde tutarlı bir kullanım süresi hesaplaması sağlar. İş kuralları değişirse, işlevi birden çok sorguyu güncelleştirmek yerine bir kez değiştirirsiniz.

Uyarı

Bu işlev kullanır GETDATE()ve bu da onu belirleyici olmayan hale getirir. Belirlenemeyen işlevler, hesaplanan sütunlardaki dizinli görünümlerde veya dizinlerde kullanılamaz. Determinizm gerektiren senaryolar için bunun yerine geçerli tarihi parametre olarak geçirin.

Skaler işlevler için en iyi yöntemleri uygulama

Skaler işlevler oluşturduğunuzda, en iyi performansın ve sürdürülebilirliğin sağlanmasına yardımcı olan birçok en iyi yöntem vardır. Bu uygulamaları anlamak, yaygın tuzaklardan kaçınmanıza ve verimli, güvenilir işlevler oluşturmanıza yardımcı olur.

İlk olarak, mümkün olduğunca skaler işlevlerinizi belirleyici tutun. Belirleyici bir işlev her zaman aynı giriş parametrelerine göre aynı sonucu döndürür. Sistem tarih/saat işlevlerine veya tablolarına başvuran işlevler belirleyici değildir ve belirli sorgu iyileştirmelerini engelleyebilir.

Ayrıca, işlevlerinizde yan etkilerden kaçının. Skaler işlevlerin veritabanı durumunu değiştirmemesi veya dış kaynaklara bağımlılıkları olmamalıdır. SQL Server işlevleri beklediğinizden birden çok kez veya farklı siparişlerde yürütebileceğinden bu kısıtlama mevcuttur.

Son olarak, performans etkilerine dikkat edin. Büyük tablolar içeren bir WHERE yan tümcede veya SELECT listede skaler bir işlev kullandığınızda, SQL Server işlevi her satır için yürütebilir. Bu, sorgu performansını önemli ölçüde etkileyebilir. Bu tür senaryolar için, alternatif olarak satır içi tablo değerli işlevleri göz önünde bulundurun.

Aşağıda, şu uygulamaları izleyen iyi tasarlanmış bir skaler işlev örneği verilmiştir:

CREATE FUNCTION dbo.FormatPhoneNumber
(
    @PhoneNumber VARCHAR(10)
)
RETURNS VARCHAR(14)
AS
BEGIN
    DECLARE @FormattedNumber VARCHAR(14)
    
    IF LEN(@PhoneNumber) = 10
        SET @FormattedNumber = '(' + SUBSTRING(@PhoneNumber, 1, 3) + ') ' +
                               SUBSTRING(@PhoneNumber, 4, 3) + '-' +
                               SUBSTRING(@PhoneNumber, 7, 4)
    ELSE
        SET @FormattedNumber = @PhoneNumber
    
    RETURN @FormattedNumber
END

Bu işlev belirleyicidir, yan etkisi yoktur ve basit bir dönüştürme gerçekleştirir. Telefon numarası beklenen biçimle eşleşmediğinde özgün değeri döndürerek geçersiz girişi düzgün bir şekilde işler.

Skaler işlevleri değiştirme ve yönetme

ALTER FUNCTION deyimini kullanarak bir skaler işlev oluşturduktan sonra tanımını değiştirebilirsiniz. ALTER FUNCTION söz dizimi, CREATE FUNCTION işlevini bırakıp yeniden oluşturmadan değiştirmenize olanak tanır, bu sayede izinler ve bağımlılıklar korunur.

ALTER FUNCTION dbo.CalculateSalesTax
(
    @Amount DECIMAL(10,2),
    @TaxRate DECIMAL(5,4)
)
RETURNS DECIMAL(10,2)
AS
BEGIN
    DECLARE @TaxAmount DECIMAL(10,2)
    -- Updated logic with rounding
    SET @TaxAmount = ROUND(@Amount * @TaxRate, 2)
    RETURN @TaxAmount
END

Bir skaler işlevi kaldırmak için DROP FUNCTION ifadesini kullanırsınız.

DROP FUNCTION IF EXISTS dbo.CalculateSalesTax

IF EXISTS yan tümcesi, işlev yoksa hataları önler ve bu da dağıtım betiklerinde yararlıdır. bir işlevi bırakmadan önce, gibi sys.sql_expression_dependenciessistem görünümlerini denetleyerek başka veritabanı nesnelerinin bağımlı olmadığını doğrulayın.