Saya telah mempelajari Fungsi dan Prosedur Tersimpan selama beberapa waktu tetapi saya tidak tahu mengapa dan kapan saya harus menggunakan fungsi atau prosedur yang tersimpan. Mereka terlihat sama dengan saya, mungkin karena saya agak pemula tentang itu.
Bisakah seseorang memberi tahu saya alasannya?
Jawaban:
Fungsi adalah nilai yang dihitung dan tidak dapat melakukan perubahan lingkungan permanen untuk
SQL Server
(yaitu, tidak adaINSERT
atauUPDATE
pernyataan diizinkan).Suatu fungsi dapat digunakan inline dalam
SQL
pernyataan jika ia mengembalikan nilai skalar atau dapat digabungkan jika mengembalikan set hasil.Poin yang perlu diperhatikan dari komentar, yang merangkum jawabannya. Terima kasih kepada @Sean K Anderson:
Cara memanggil
SQL
fungsi dari prosedur store dan saat kami menggunakan fungsi alih-alih prosedur yang tersimpan.Hai teman-teman, hari ini kita akan membahas Kapan harus menggunakan prosedur tersimpan dan kapan harus menggunakan fungsi. Dalam tim sederhana Jika Anda ingin menghitung beberapa nilai dan itu akan mengembalikan nilai tunggal, jadi itu tidak diperlukan:
https://programmingtechtutorial.blogspot.com/2020/01/when-use-storeprocedure-and-when-use.html
sumber
Perbedaan antara SP dan UDF tercantum di bawah ini:
sumber
Fungsi dan prosedur yang tersimpan melayani tujuan yang terpisah. Meskipun itu bukan analogi terbaik, fungsi dapat dilihat secara harfiah sebagai fungsi lain yang akan Anda gunakan dalam bahasa pemrograman apa pun, tetapi procs yang disimpan lebih seperti program individual atau skrip batch.
Fungsi biasanya memiliki output dan input opsional. Output kemudian dapat digunakan sebagai input ke fungsi lain (built-in SQL Server seperti DATEDIFF, LEN, dll) atau sebagai predikat ke SQL Query - misalnya,
SELECT a, b, dbo.MyFunction(c) FROM table
atauSELECT a, b, c FROM table WHERE a = dbo.MyFunc(c)
.Procs tersimpan digunakan untuk mengikat query SQL bersama dalam suatu transaksi, dan antarmuka dengan dunia luar. Kerangka kerja seperti ADO.NET, dll. Tidak dapat memanggil fungsi secara langsung, tetapi mereka dapat memanggil proc yang disimpan secara langsung.
Fungsi memang memiliki bahaya tersembunyi: mereka dapat disalahgunakan dan menyebabkan masalah kinerja yang agak buruk: pertimbangkan pertanyaan ini:
Di mana MyFunction dinyatakan sebagai:
Apa yang terjadi di sini adalah bahwa fungsi MyFunction dipanggil untuk setiap baris dalam tabel MyTable. Jika MyTable memiliki 1000 baris, maka itu adalah 1000 permintaan ad-hoc terhadap database. Demikian pula, jika fungsi dipanggil saat ditentukan dalam spesifikasi kolom, maka fungsi akan dipanggil untuk setiap baris yang dikembalikan oleh SELECT.
Jadi Anda memang harus hati-hati menulis fungsi. Jika Anda melakukan SELECT dari tabel dalam suatu fungsi, Anda perlu bertanya pada diri sendiri apakah itu bisa lebih baik dilakukan dengan GABUNG di induk yang disimpan proc atau beberapa konstruksi SQL lainnya (seperti KASUS ... KAPAN ... KETIKA ... LAIN ... AKHIR).
sumber
SELECT * from dbo.MyTableValuedFunction()
. Sprocs, di sisi lain, dapat dipanggil langsung dengan ADO.NET dengan mengaturSqlCommand.CommandType
keCommandType.StoredProcedure
.Perbedaan antara prosedur tersimpan dan fungsi yang ditentukan pengguna:
RAISEERROR
ATAU@@ERROR
tidak diizinkan di UDF.GETDATE()
tidak dapat digunakan dalam UDF.sumber
GETDATE()
dapat digunakan dalam suatu Fungsi. Pivot pada Non-deterministik tidak bagus.Tulis fungsi yang ditentukan pengguna saat Anda ingin menghitung dan mengembalikan nilai untuk digunakan dalam pernyataan SQL lainnya; tulis prosedur tersimpan ketika Anda ingin mengelompokkan seperangkat pernyataan SQL yang mungkin rumit. Ini adalah dua kasus penggunaan yang sangat berbeda!
sumber
sumber
Perbedaan Dasar
Fungsi harus mengembalikan nilai tetapi dalam Prosedur Tersimpan itu opsional (Prosedur dapat mengembalikan nilai nol atau n).
Fungsi hanya dapat memiliki parameter input untuknya sedangkan Prosedur dapat memiliki parameter input / output.
Fungsi mengambil satu parameter input itu wajib tetapi Prosedur Tersimpan dapat mengambil parameter input n ke ..
Fungsi dapat dipanggil dari Prosedur sedangkan Prosedur tidak dapat dipanggil dari Fungsi.
Perbedaan Uang Muka
Prosedur memungkinkan SELECT serta pernyataan DML (INSERT / UPDATE / DELETE) di dalamnya sedangkan Function hanya mengizinkan pernyataan SELECT di dalamnya.
Prosedur tidak dapat digunakan dalam pernyataan SELECT sedangkan Function dapat tertanam dalam pernyataan SELECT.
Stored Prosedur tidak dapat digunakan dalam pernyataan SQL di mana saja di bagian WHERE / HAVING / SELECT sedangkan Function bisa.
Fungsi yang mengembalikan tabel dapat diperlakukan sebagai rowset lain. Ini dapat digunakan dalam BERGABUNG dengan tabel lain.
Fungsi Inline dapat berupa sebagai view yang mengambil parameter dan dapat digunakan dalam BERGABUNG dan operasi Rowset lainnya.
Pengecualian dapat ditangani oleh blok try-catch dalam Prosedur sedangkan blok try-catch tidak dapat digunakan dalam suatu Fungsi.
Kita bisa pergi untuk Manajemen Transaksi dalam Prosedur sedangkan kita tidak bisa masuk dalam Function.
sumber
sumber
Returns
kata kunci dan harus berupa skalar atau tipe tabel) , tetapi Prosedur yang Disimpan dapat secara opsional mengembalikan: a) 1Int
jenis Kode Hasil melaluiReturn
Pernyataan dan / atau b) 1+ Parameter (termasukCursor
jenis) melaluiOutput
kata kunci dan / atau c) 1+ Kumpulan Baris melaluiSelect
Pernyataan. Jika hanya 1 Baris yang Ditetapkan dikembalikan, itu dapat digunakan sebagai argumen "execute_statement" dari pernyataan "Sisipkan Ke". "Fungsi yang Ditetapkan Pengguna adalah alat penting yang tersedia untuk pemrogram server sql. Anda dapat menggunakannya sebaris dalam pernyataan SQL seperti itu
di mana
lookupValue
akan menjadi UDF. Fungsionalitas semacam ini tidak dimungkinkan saat menggunakan prosedur tersimpan. Pada saat yang sama Anda tidak dapat melakukan hal-hal tertentu di dalam UDF. Hal dasar yang perlu diingat di sini adalah bahwa UDF:prosedur tersimpan dapat melakukan hal-hal itu.
Bagi saya penggunaan sebaris UDF adalah penggunaan paling penting dari UDF.
sumber
Prosedur Tersimpan digunakan sebagai skrip . Mereka menjalankan serangkaian perintah untuk Anda dan Anda dapat menjadwalkannya untuk dijalankan pada waktu-waktu tertentu. Biasanya menjalankan beberapa pernyataan DML seperti INSERT, UPDATE, DELETE, dll. Atau bahkan SELECT.
Fungsi digunakan sebagai metode. Anda memberikan sesuatu dan mengembalikan hasilnya. Harus kecil dan cepat - lakukan dengan cepat. Biasanya digunakan dalam pernyataan SELECT.
sumber
Prosedur tersimpan:
EXEC
atauEXECUTE
pernyataan.OUT
parameter.Fungsi:
Hanya dapat digunakan untuk memilih catatan. Namun, ini dapat dipanggil dengan sangat mudah dari dalam SQL standar, seperti:
atau
Untuk operasi pilih sederhana yang dapat digunakan kembali, fungsi dapat menyederhanakan kode. Berhati-hatilah dalam menggunakan
JOIN
klausa dalam fungsi Anda. Jika fungsi Anda memilikiJOIN
klausa dan Anda menyebutnya dari pernyataan pilih lain yang mengembalikan beberapa hasil, panggilan fungsi itu akanJOIN
tabel tersebut bersama-sama untuk setiap baris yang dikembalikan dalam set hasil. Jadi, meskipun mereka bisa membantu menyederhanakan beberapa logika, mereka juga bisa menjadi hambatan kinerja jika mereka tidak digunakan dengan benar.OUT
parameter.sumber
Fungsi Buatan Pengguna.
Prosedur Tersimpan
sumber
Untuk memutuskan kapan harus menggunakan apa yang mungkin membantu poin-poin berikut-
Prosedur yang disimpan tidak dapat mengembalikan variabel tabel di mana fungsi dapat melakukannya.
Anda dapat menggunakan prosedur tersimpan untuk mengubah parameter lingkungan server di mana menggunakan fungsi yang tidak bisa dilakukan.
Bersulang
sumber
Fungsi SQL Server, seperti kursor, dimaksudkan untuk digunakan sebagai senjata terakhir Anda! Mereka memang memiliki masalah kinerja dan karenanya menggunakan fungsi bernilai tabel harus dihindari sebanyak mungkin. Berbicara tentang kinerja adalah berbicara tentang tabel dengan lebih dari 1.000.000 catatan yang di-host di server pada perangkat keras kelas menengah; jika tidak, Anda tidak perlu khawatir tentang kinerja yang disebabkan oleh fungsi.
untuk referensi lebih lanjut lihat: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-atau--user-defined-fungsi.html
sumber
Mulai dengan fungsi yang mengembalikan nilai tunggal. Yang menyenangkan adalah Anda dapat memasukkan kode yang sering digunakan ke dalam suatu fungsi dan mengembalikannya sebagai kolom dalam hasil yang ditetapkan.
Kemudian, Anda mungkin menggunakan fungsi untuk daftar kota berparameter. dbo.GetCitiesIn ("NY") Itu mengembalikan tabel yang dapat digunakan sebagai gabungan.
Ini cara mengatur kode. Mengetahui kapan sesuatu dapat digunakan kembali dan kapan membuang-buang waktu adalah sesuatu yang hanya didapat melalui coba-coba dan kesalahan serta pengalaman.
Juga, fungsi adalah ide bagus di SQL Server. Mereka lebih cepat dan bisa sangat kuat. Pilih sebaris dan langsung. Hati-hati jangan sampai berlebihan.
sumber
Inilah alasan praktis untuk lebih memilih fungsi daripada prosedur tersimpan. Jika Anda memiliki prosedur tersimpan yang membutuhkan hasil dari prosedur tersimpan lain, Anda harus menggunakan pernyataan insert-exec. Ini berarti bahwa Anda harus membuat tabel temp dan menggunakan
exec
pernyataan untuk memasukkan hasil dari prosedur tersimpan ke dalam tabel temp. Berantakan. Satu masalah dengan ini adalah bahwa insert-execs tidak dapat diulang .Jika Anda terjebak dengan prosedur tersimpan yang memanggil prosedur tersimpan lainnya, Anda mungkin mengalami ini. Jika prosedur tersimpan bersarang hanya mengembalikan dataset, itu bisa diganti dengan fungsi bernilai tabel dan Anda tidak akan lagi mendapatkan kesalahan ini.
( ini adalah alasan lain mengapa kita harus menjaga logika bisnis dari database )
sumber
sumber
Fungsi dapat digunakan dalam pernyataan pilih sedangkan prosedur tidak bisa.
Prosedur tersimpan mengambil parameter input dan output tetapi Fungsi hanya mengambil parameter input.
Fungsi tidak dapat mengembalikan nilai jenis teks, nteks, gambar & cap waktu di mana prosedur dapat.
Fungsi dapat digunakan sebagai tipe data yang ditentukan pengguna dalam membuat tabel tetapi prosedur tidak bisa.
*** Misalnya: -membuat
table <tablename>(name varchar(10),salary getsal(name))
Di sini getal adalah fungsi yang ditentukan pengguna yang mengembalikan jenis gaji, ketika tabel dibuat tidak ada penyimpanan yang dialokasikan untuk jenis gaji, dan fungsi getal juga tidak dieksekusi, tetapi ketika kita mengambil beberapa nilai dari tabel ini, fungsi getal dijalankan dan return Type dikembalikan sebagai hasil yang ditetapkan.
sumber
Saya menyadari ini adalah pertanyaan yang sangat lama, tetapi saya tidak melihat satu aspek penting yang disebutkan dalam salah satu jawaban: masuk ke dalam rencana kueri.
Fungsi dapat ...
Skalar:
CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END
Multi-pernyataan bernilai tabel:
CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END
Nilai tabel inline:
CREATE FUNCTION ... RETURNS TABLE AS RETURN SELECT ...
Jenis ketiga (nilai tabel inline) diperlakukan oleh pengoptimal kueri pada dasarnya sebagai tampilan (parametrized), yang berarti bahwa merujuk fungsi dari permintaan Anda mirip dengan menyalin-menempelkan fungsi tubuh SQL (tanpa benar-benar menyalin-menempel), memimpin untuk manfaat berikut:
Hal di atas dapat menyebabkan penghematan kinerja yang berpotensi signifikan, terutama ketika menggabungkan berbagai fungsi.
CATATAN: Sepertinya SQL Server 2019 akan memperkenalkan beberapa bentuk inline fungsi skalar juga.
sumber
Dalam SQL Server, fungsi dan prosedur tersimpan adalah dua jenis entitas yang berbeda.
Fungsi: Dalam database SQL Server, fungsi tersebut digunakan untuk melakukan beberapa tindakan dan tindakan segera mengembalikan hasilnya. Fungsi adalah dua jenis:
Sistem didefinisikan
Ditetapkan pengguna
Stored Procedures: Dalam SQL Server, prosedur yang tersimpan disimpan di server dan dapat mengembalikan nilai nol, tunggal dan banyak. Prosedur Tersimpan adalah dua jenis:
sumber