Membuat fungsi skalar

Selesai

Fungsi skalar adalah alat penting di SQL Server yang memungkinkan Anda merangkum logika yang dapat digunakan kembali dan mengembalikan satu nilai. Anda dapat menggunakannya secara langsung dalam SELECT pernyataan, WHERE klausul, dan ekspresi T-SQL lainnya, membuat kueri Anda lebih dapat dipertahankan dan kode Anda lebih modular.

Memahami dasar-dasar fungsi skalar

Fungsi skalar menerima nol atau lebih parameter dan mengembalikan satu nilai dari jenis data tertentu. Tidak seperti prosedur tersimpan, fungsi skalar dapat disematkan langsung dalam ekspresi SQL di mana pun Anda akan menggunakan kolom atau variabel.

Karakteristik utama fungsi skalar mencakup kemampuannya untuk menerima parameter input, melakukan perhitungan atau transformasi, dan mengembalikan tepat satu nilai. Anda menentukan jenis data pengembalian secara eksplisit dalam definisi fungsi, yang divalidasi SQL Server pada waktu pembuatan.

Saat Anda membuat fungsi skalar, Anda membuat bagian logika yang dapat digunakan kembali yang dapat dipanggil pengembang lain di seluruh database. Ini mempromosikan penggunaan kembali kode dan membantu menjaga konsistensi di seluruh aplikasi Anda.

Menentukan sintaks fungsi skalar

Untuk membuat fungsi skalar, Anda menggunakan CREATE FUNCTION pernyataan dengan komponen sintaks tertentu. Struktur dasar mencakup nama fungsi, parameter, jenis pengembalian, dan isi fungsi.

Berikut adalah pola sintaks dasarnya:

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

Klausa RETURNS menentukan jenis data dari nilai tunggal yang dikembalikan fungsi. Dalam blok BEGIN...END, Anda menulis logika T-SQL Anda dan menggunakan perintah RETURN untuk mengirim kembali hasilnya.

Misalnya, Anda dapat membuat fungsi sederhana yang menghitung pajak penjualan:

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

Fungsi ini menerima dua parameter dan mengembalikan jumlah pajak yang dihitung. Anda dapat menggunakan fungsi ini dalam pernyataan apa pun SELECT .

Menerapkan fungsi skalar dengan logika bisnis

Fungsi skalar unggul dalam merangkum aturan dan perhitungan bisnis yang perlu Anda terapkan secara konsisten di seluruh database Anda. Dengan fungsi skalar, Anda memusatkan logika yang mungkin diduplikasi dalam beberapa kueri atau kode aplikasi.

Pertimbangkan skenario di mana Anda perlu menghitung masa kerja karyawan dalam beberapa tahun. Anda membuat fungsi skalar yang menerima tanggal sewa dan mengembalikan jumlah tahun lengkap:

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

Anda dapat menggunakan fungsi ini dalam kueri untuk menampilkan informasi penyewaan:

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

Pendekatan ini memastikan perhitungan tenure yang konsisten di seluruh database Anda. Jika aturan bisnis berubah, Anda mengubah fungsi sekali daripada memperbarui beberapa kueri.

Nota

Fungsi ini menggunakan GETDATE(), yang membuatnya tidak deterministik. Fungsi non-deterministik tidak dapat digunakan dalam tampilan atau indeks terindeks pada kolom komputasi. Untuk skenario yang memerlukan determinisme, lewati tanggal saat ini sebagai parameter sebagai gantinya.

Menerapkan praktik terbaik untuk fungsi skalar

Saat Anda membuat fungsi skalar, beberapa praktik terbaik membantu memastikan performa dan pemeliharaan yang optimal. Memahami praktik ini membantu Anda menghindari perangkap umum dan menciptakan fungsi yang efisien dan andal.

Pertama, jaga deterministik fungsi skalar Anda jika memungkinkan. Fungsi deterministik selalu mengembalikan hasil yang sama mengingat parameter input yang sama. Fungsi yang mereferensikan fungsi atau tabel tanggal/waktu sistem tidak deterministik dan dapat mencegah pengoptimalan kueri tertentu.

Selain itu, hindari efek samping dalam fungsi Anda. Fungsi skalar tidak boleh mengubah status database atau memiliki dependensi pada sumber daya eksternal. Pembatasan ini ada karena SQL Server dapat menjalankan fungsi beberapa kali atau dalam urutan yang berbeda dari yang Anda harapkan.

Terakhir, perhatikan implikasi performa. Saat Anda menggunakan fungsi skalar dalam WHERE klausa atau SELECT daftar dengan tabel besar, SQL Server dapat menjalankan fungsi untuk setiap baris. Hal ini dapat berdampak signifikan pada performa kueri. Untuk skenario tersebut, pertimbangkan fungsi bernilai tabel sebaris sebagai alternatif.

Berikut adalah contoh fungsi skalar yang dirancang dengan baik yang mengikuti praktik berikut:

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

Fungsi ini deterministik, tidak memiliki efek samping, dan melakukan transformasi yang mudah. Ini menangani input yang tidak valid dengan baik dengan mengembalikan nilai asli ketika nomor telepon tidak cocok dengan format yang diharapkan.

Mengubah dan mengelola fungsi skalar

Setelah membuat fungsi skalar, Anda dapat memodifikasi definisinya menggunakan ALTER FUNCTION pernyataan . Sintaks ALTER FUNCTION mencerminkan CREATE FUNCTION tetapi memungkinkan Anda mengubah fungsi tanpa menghilangkan dan membuatnya kembali, yang mempertahankan izin dan dependensi.

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

Untuk menghapus fungsi skalar, Anda menggunakan DROP FUNCTION pernyataan :

DROP FUNCTION IF EXISTS dbo.CalculateSalesTax

Klausa IF EXISTS mencegah kesalahan jika fungsi tidak ada, yang berguna dalam skrip penyebaran. Sebelum menghilangkan fungsi, verifikasi bahwa tidak ada objek database lain yang bergantung padanya dengan memeriksa tampilan sistem seperti sys.sql_expression_dependencies.