Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Buat Fungsi Buatan Pengguna Skalar di SQL Server

Di SQL Server, Anda dapat membuat fungsi skalar yang ditentukan pengguna menggunakan CREATE FUNCTION penyataan. Fungsi skalar yang ditentukan pengguna, atau dikenal sebagai UDF skalar, adalah fungsi yang ditentukan pengguna yang mengembalikan nilai tunggal.

Artikel ini berisi contoh pembuatan beberapa UDF skalar T-SQL dasar.

Sintaks

Pertama, mari kita lihat sintaks untuk membuat UDF skalar.

Sintaks untuk UDF skalar T-SQL seperti ini:

 BUAT [ OR ALTER ] FUNGSI [ nama_skema. ] function_name ( [ { @parameter_name [ AS ][ type_schema_name. ] parameter_data_type [ =default ] [ READONLY ] } [ ,...n ] ] ) RETURNS return_data_type [ WITH  [ ,...n ] ] [ AS ] BEGIN function_body RETURN scalar_expression END [; ]

Dan sintaks untuk UDF skalar CLR:

 BUAT [ OR ALTER ] FUNGSI [ nama_skema. ] function_name ( { @parameter_name [AS] [ type_schema_name. ] parameter_data_type [ =default ] } [ ,...n ] ) KEMBALI { return_data_type } [ WITH  [ ,...n ] ] [ SEBAGAI ] NAMA EKSTERNAL  [; ] 

Bagian-bagian di <function_option> untuk fungsi T-SQL dan <clr_function_option> untuk fungsi CLR memungkinkan Anda menentukan opsi untuk UDF. Opsi fungsi termasuk menambahkan enkripsi, pengikatan skema, EXECUTE AS klausa, serta menentukan apa yang harus dilakukan ketika nilai NULL dilewatkan sebagai argumen.

Daftar lengkap argumen dan opsi fungsi dapat ditemukan di situs web Microsoft.

Dokumentasi Microsoft berisi banyak detail, jadi contoh berikut ditujukan untuk memberikan gambaran singkat tentang beberapa konsep dan opsi umum saat membuat UDF skalar.

Contoh 1 – UDF Skalar Dasar

Berikut adalah contoh kode yang digunakan untuk membuat UDF skalar T-SQL dasar.

BUAT FUNGSI dbo.ufn_discountPrice( @price DECIMAL(12,2), @discount DECIMAL(12,2) ) RETURNS DECIMAL (12,2)ASBEGIN RETURN @price * (1 - @discount);END; 

UDF skalar ini menerima dua parameter; @price dan @discount . Ini diteruskan ke fungsi sebagai argumen setiap kali fungsi dipanggil. Fungsi mengambil nilai argumen tersebut, melakukan penghitungan menggunakan nilai tersebut, lalu mengembalikan nilai yang dihasilkan. Dalam hal ini, harga diskon dikembalikan.

Contoh 2 – Aktifkan UDF

Setelah UDF dibuat, UDF dapat dipanggil dalam kode T-SQL kapan pun Anda membutuhkannya.

Berikut ini contoh pemanggilan UDF:

SELECT dbo.ufn_discountPrice(100, .2) SEBAGAI Hasil;

Hasil

+----------+| Hasil ||----------|| 80.00 |+----------+

Contoh 3 – Membuat Kueri Tabel

UDF skalar juga dapat melakukan hal-hal seperti tabel database kueri.

Ini salah satu yang mengembalikan jumlah album dalam database untuk artis tertentu.

BUAT FUNGSI dbo.ufn_CountAlbums (@ArtistId int) KEMBALI smallintAS MULAI MENYATAKAN @AlbumCount int; PILIH @AlbumCount =COUNT(AlbumId) DARI Album WHERE ArtistId =@ArtistId; KEMBALI @AlbumCount;END;

Ini adalah fungsi skalar karena mengembalikan nilai tunggal. Jika kita ingin mengembalikan daftar album, maka kita perlu menggunakan fungsi bernilai tabel, karena fungsi bernilai tabel mengembalikan hasilnya sebagai kumpulan baris.

Contoh 4 – Pengikatan Skema

Saat Anda membuat fungsi yang ditentukan pengguna yang bergantung pada objek lain dalam database, biasanya ide yang baik untuk mengikat skema UDF. Skema yang mengikat UDF memastikan bahwa tidak ada perubahan yang dapat dilakukan pada objek yang mendasarinya yang berpotensi memengaruhi fungsi.

Misalnya, Anda tidak akan dapat menghapus tabel yang digunakan UDF terikat skema dalam definisinya.

Untuk mengikat skema UDF, gunakan WITH SCHEMABINDING dalam definisinya. Anda juga perlu menggunakan nama dua bagian untuk objek apa pun yang dirujuk di UDF.

Berikut contoh sebelumnya yang ditulis ulang sehingga terikat skema:

BUAT FUNGSI dbo.ufn_CountAlbums (@ArtistId int) KEMBALI smallintDENGAN SKEMABINDINGAS MULAI MENYATAKAN @AlbumCount int; PILIH @AlbumCount =COUNT(AlbumId) DARI dbo.Albums WHERE ArtistId =@ArtistId; KEMBALI @AlbumCount;END;

Jadi, saya mengubah dua hal dari contoh pertama. Saya menambahkan WITH SCHEMABINDING , dan saya mengubah Albums ke dbo.Albums .

Sekarang jika seseorang mencoba untuk menjatuhkan tabel itu atau membuat perubahan lain padanya, mereka akan mendapatkan kesalahan.

Contoh 5 – Enkripsi

Anda juga dapat menggunakan WITH ENCRYPTION untuk mengenkripsi fungsi.

BUAT FUNGSI dbo.ufn_CountAlbums (@ArtistId int) KEMBALI smallintWITH ENCRYPTIONAS MULAI DECLARE @AlbumCount int; PILIH @AlbumCount =COUNT(AlbumId) DARI dbo.Albums WHERE ArtistId =@ArtistId; KEMBALI @AlbumCount;END;

Contoh 6 – Masukan NULL

Saat menjalankan fungsi, jika salah satu argumennya NULL, badan fungsi masih dijalankan. Yaitu, kecuali jika Anda secara eksplisit menyatakan RETURNS NULL ON NULL INPUT dalam definisi fungsi.

Menentukan opsi itu akan mengembalikan NULL jika salah satu argumennya NULL.

BUAT FUNGSI dbo.ufn_CountAlbums (@ArtistId int) RETURNS smallintWITH RETURNS NULL ON NULL INPUTAS MULAI MENYATAKAN @AlbumCount int; PILIH @AlbumCount =COUNT(AlbumId) DARI dbo.Albums WHERE ArtistId =@ArtistId; KEMBALI @AlbumCount;END;

Ketika saya memanggil fungsi menggunakan NULL sebagai argumen:

SELECT dbo.ufn_CountAlbums(NULL) SEBAGAI Hasil;

Saya mendapatkan hasil yang berbeda, tergantung pada apa yang saya tentukan untuk opsi ini.

Berikut adalah hasil ketika fungsi menggunakan pengaturan default (CALLED ON NULL INPUT ):

+----------+| Hasil ||----------|| 0 |+----------+

Dan inilah hasilnya ketika menggunakan RETURNS NULL ON NULL INPUT :

+----------+| Hasil ||----------|| NULL |+----------+

Contoh 7 – Beberapa Opsi

Anda dapat memisahkan beberapa opsi dengan koma.

Berikut adalah contoh yang menambahkan enkripsi dan pengikatan skema ke fungsi:

BUAT FUNGSI dbo.ufn_CountAlbums (@ArtistId int) MENGEMBALIKAN smallintDENGAN ENKRIPSI, SKEMABINDINGAS MULAI MENYATAKAN @AlbumCount int; PILIH @AlbumCount =COUNT(AlbumId) DARI dbo.Albums WHERE ArtistId =@ArtistId; KEMBALI @AlbumCount;END;

Contoh 8 – Mengubah Fungsi

Anda dapat mengubah UDF skalar dengan mengganti CREATE dengan ALTER .

ALTER FUNCTION dbo.ufn_CountAlbums (@ArtistId int) MENGEMBALIKAN smallintDENGAN SKEMABINDINGAS MULAI MENYATAKAN @AlbumCount int; PILIH @AlbumCount =COUNT(AlbumId) DARI dbo.Albums WHERE ArtistId =@ArtistId; KEMBALI @AlbumCount;END;

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Anda membuka file SDF (SQL Server Compact Edition)?

  2. Kembalikan Prosedur &Fungsi Tersimpan dalam Database SQL Server:RUTIN (Contoh T-SQL)

  3. Impor Beberapa File CSV ke SQL Server dari Folder

  4. Operasi CRUD dengan ASP.NET Core MVC, Entity Framework Core, dan SQL Server

  5. Apa yang dimaksud dengan exec sp_reset_connection di Sql Server Profiler?