Prosedur vs. Prosedur yang Disimpan dalam SQL Server

831

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?

Tarik
sumber
1
wiki.answers.com/Q/…
Freelancer
3
bagaimana dengan kecepatan? mana yang menjalankan kueri yang sama lebih cepat?
AmiNadimi

Jawaban:

708

Fungsi adalah nilai yang dihitung dan tidak dapat melakukan perubahan lingkungan permanen untuk SQL Server(yaitu, tidak ada INSERTatau UPDATEpernyataan diizinkan).

Suatu fungsi dapat digunakan inline dalam SQLpernyataan 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:

Fungsinya mengikuti definisi ilmu komputer bahwa mereka HARUS mengembalikan nilai dan tidak dapat mengubah data yang mereka terima sebagai parameter (argumen). Fungsi tidak diizinkan untuk mengubah apa pun, harus memiliki setidaknya satu parameter, dan mereka harus mengembalikan nilai. Procs yang disimpan tidak harus memiliki parameter, dapat mengubah objek database, dan tidak harus mengembalikan nilai.

Cara memanggil SQLfungsi 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

MyItchyChin
sumber
13
Pada dasarnya tidak ada DML yang diizinkan?
david blaine
173
Fungsi mengikuti definisi kemahiran komputer karena mereka HARUS mengembalikan nilai dan tidak dapat mengubah data yang mereka terima sebagai parameter (argumen). Fungsi tidak diizinkan untuk mengubah apa pun, harus memiliki setidaknya satu parameter, dan mereka harus mengembalikan nilai. Procs yang disimpan tidak harus memiliki parameter, dapat mengubah objek database, dan tidak harus mengembalikan nilai.
Sean Anderson
23
Bahkan Anda bisa memiliki pernyataan INSERT, UPDATE, dan DELETE dalam suatu fungsi, untuk memodifikasi variabel tabel lokal.
Ani
14
@ Ali - Anda dapat instantiate dan memodifikasi sejumlah variabel lokal dengan dalam suatu fungsi namun Anda tidak dapat memodifikasi apa pun di luar lingkup fungsi.
MyItchyChin
40
Fungsi @SeanKAnderson "harus memiliki setidaknya satu parameter" tidak benar.
liang
624

Perbedaan antara SP dan UDF tercantum di bawah ini:

+---------------------------------+----------------------------------------+
| Stored Procedure (SP)           | Function (UDF - User Defined           |
|                                 | Function)                              |
+---------------------------------+----------------------------------------+
| SP can return zero , single or  | Function must return a single value    |
| multiple values.                | (which may be a scalar or a table).    |
+---------------------------------+----------------------------------------+
| We can use transaction in SP.   | We can't use transaction in UDF.       |
+---------------------------------+----------------------------------------+
| SP can have input/output        | Only input parameter.                  |
| parameter.                      |                                        |
+---------------------------------+----------------------------------------+
| We can call function from SP.   | We can't call SP from function.        |
+---------------------------------+----------------------------------------+
| We can't use SP in SELECT/      | We can use UDF in SELECT/ WHERE/       |
| WHERE/ HAVING statement.        | HAVING statement.                      |
+---------------------------------+----------------------------------------+
| We can use exception handling   | We can't use Try-Catch block in UDF.   |
| using Try-Catch block in SP.    |                                        |
+---------------------------------+----------------------------------------+
Bhaumik Patel
sumber
21
Fungsi harus mengembalikan satu nilai, atau satu set.
Rafareino
8
Ini datang 3 tahun kemudian tetapi harus di atas karena mudah dibaca dan luas.
DanteTheSmith
SP dapat menggunakan variabel tabel temp dan variabel tabel sedangkan UDF hanya dapat menggunakan variabel tabel. Variabel tabel pada gilirannya mungkin tidak menggunakan indeks. UDF dapat dipanggil dalam SALJU BERLAKU tidak seperti SP
Ludovic Aubert
190

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 tableatau SELECT 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:

SELECT * FROM dbo.MyTable WHERE col1 = dbo.MyFunction(col2)

Di mana MyFunction dinyatakan sebagai:

CREATE FUNCTION MyFunction (@someValue INTEGER) RETURNS INTEGER
AS
BEGIN
   DECLARE @retval INTEGER

   SELECT localValue 
      FROM dbo.localToNationalMapTable
      WHERE nationalValue = @someValue

   RETURN @retval
END

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).

Chris J
sumber
2
Bisakah Anda menguraikan "Kerangka kerja seperti ADO.NET, dll. Tidak dapat memanggil fungsi secara langsung"? Saya telah menjalankan fungsi dengan penyedia data ADO.NET tanpa masalah.
Ian Kemp
24
Anda harus memanggil suatu fungsi melalui beberapa pernyataan SELECT - suatu fungsi tidak dapat disebut sebagai bagian kode yang independen dalam dirinya sendiri - ia harus dipanggil sebagai bagian dari beberapa pernyataan SQL yang lebih besar, bahkan jika pernyataan SQL itu tidak lebih dari SELECT * from dbo.MyTableValuedFunction(). Sprocs, di sisi lain, dapat dipanggil langsung dengan ADO.NET dengan mengatur SqlCommand.CommandTypeke CommandType.StoredProcedure.
Chris J
60

Perbedaan antara prosedur tersimpan dan fungsi yang ditentukan pengguna:

  • Prosedur tersimpan tidak dapat digunakan dalam pernyataan Select.
  • Prosedur tersimpan mendukung Resolusi Nama Tangguhan.
  • Prosedur tersimpan umumnya digunakan untuk melakukan logika bisnis.
  • Prosedur tersimpan dapat mengembalikan tipe data apa pun.
  • Prosedur yang disimpan dapat menerima jumlah parameter input yang lebih besar daripada fungsi yang ditentukan pengguna. Prosedur tersimpan dapat memiliki hingga 21.000 parameter input.
  • Prosedur tersimpan dapat menjalankan Dynamic SQL.
  • Prosedur tersimpan mendukung penanganan kesalahan.
  • Fungsi-fungsi non-deterministik dapat digunakan dalam prosedur tersimpan.

  • Fungsi yang ditentukan pengguna dapat digunakan dalam pernyataan Select.
  • Fungsi yang ditentukan pengguna tidak mendukung Resolusi Nama Ditangguhkan.
  • Fungsi yang ditentukan pengguna umumnya digunakan untuk perhitungan.
  • Fungsi yang ditentukan pengguna harus mengembalikan nilai.
  • Fungsi yang ditentukan pengguna tidak dapat mengembalikan gambar.
  • Fungsi yang ditentukan pengguna menerima sejumlah kecil parameter input dari pada prosedur yang tersimpan. UDF dapat memiliki hingga 1.023 parameter input.
  • Tabel sementara tidak dapat digunakan dalam fungsi yang ditentukan pengguna.
  • Fungsi yang ditentukan pengguna tidak dapat menjalankan Dynamic SQL.
  • Fungsi yang ditentukan pengguna tidak mendukung penanganan kesalahan. RAISEERRORATAU @@ERRORtidak diizinkan di UDF.
  • Fungsi-fungsi non-deterministik tidak dapat digunakan dalam UDF. Misalnya, GETDATE()tidak dapat digunakan dalam UDF.
Kumar Manish
sumber
1
Mengutip @curiousBoy di bawah ini adalah re. jawaban lain yang tidak dikreditkan (oleh @Ankit) (<- lihat bagaimana saya melakukannya?;)): "Anda harus memberikan referensi sumber. Ini dari ( blogs.msdn.microsoft.com/pradeepsvs/2014/10 / 08 / ... ). Harap hormati pekerjaan yang dilakukan orang lain! "
Tom
7
Blog ini telah ditulis sejak 8 Oktober 2014 dan jawaban ini telah ditulis sejak 2 Mei 2013 @Tom
Kumar Manish
1
@ Code Rider: Ah, permintaan maaf saya! Tidak percaya saya tidak memperhatikan itu! Jadi, blog menyalin Anda (atau orang lain yang melakukannya) tanpa kredit?
Tom
GETDATE()dapat digunakan dalam suatu Fungsi. Pivot pada Non-deterministik tidak bagus.
PerformanceDBA
56

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!

Alex Martelli
sumber
18
ada berbagai jenis fungsi yang ditentukan pengguna. Skalar hanya mengembalikan nilai; jenis lain hasil set ulang.
AK
44
              STORE PROCEDURE                 FUNCTION (USER DEFINED FUNCTION)    
 * Procedure can return 0, single or   | * Function can return only single value   
   multiple values.                    |
                                       |
 * Procedure can have input, output    | * Function  can have only input 
   parameters.                         |   parameters.         
                                       |
 * Procedure cannot be called from     | * Functions can be called from 
   function.                           |   procedure.
                                       |
 * Procedure allows select as well as  | * Function allows only select statement 
   DML statement in it.                |   in it.
                                       |
 * Exception can be handled by         | * Try-catch block cannot be used in a 
   try-catch block in a procedure.     |   function.
                                       |
 * We can go for transaction management| * We can't go for transaction 
   in procedure.                       |   management in function.
                                       |
 * Procedure cannot be utilized in a   | * Function can be embedded in a select 
   select statement                    |   statement.
                                       |
 * Procedure can affect the state      | * Function can not affect the state 
   of database means it can perform    |   of database means it can not    
   CRUD operation on database.         |   perform CRUD operation on 
                                       |   database. 
                                       |
 * Procedure can use temporary tables. | * Function can not use 
                                       |   temporary tables. 
                                       |
 * Procedure can alter the server      | * Function can not alter the  
   environment parameters.             |   environment parameters.
                                       |   
 * Procedure can use when we want      | * Function can use when we want
   instead is to group a possibly-     |   to compute and return a value
   complex set of SQL statements.      |   for use in other SQL 
                                       |   statements.
Aakash Singh
sumber
1
UDF dapat dipanggil dalam SALJU BERLAKU, tidak seperti SP
Ludovic Aubert
24

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

Ankit
sumber
25
Anda seharusnya memberikan referensi sumber. Ini dari dotnet-tricks.com/Tutorial/sqlserver/… . Harap hormati pekerjaan yang dilakukan orang lain!
curiousBoy
16
Ini bukan alasan untuk tidak memberikan referensi sumber. Anda bisa menyebutkan di akhir itu!
curiousBoy
2
Kembali. "Fungsi harus mengembalikan nilai tetapi dalam Prosedur Disimpan itu opsional ....": Saya akan mengklarifikasi bahwa: "Fungsi harus mengembalikan satu dan hanya satu nilai (yang harus dilakukan melalui Returnskata kunci dan harus berupa skalar atau tipe tabel) , tetapi Prosedur yang Disimpan dapat secara opsional mengembalikan: a) 1 Intjenis Kode Hasil melalui ReturnPernyataan dan / atau b) 1+ Parameter (termasuk Cursorjenis) melalui Outputkata kunci dan / atau c) 1+ Kumpulan Baris melalui SelectPernyataan. Jika hanya 1 Baris yang Ditetapkan dikembalikan, itu dapat digunakan sebagai argumen "execute_statement" dari pernyataan "Sisipkan Ke". "
Tom
20

Fungsi yang Ditetapkan Pengguna adalah alat penting yang tersedia untuk pemrogram server sql. Anda dapat menggunakannya sebaris dalam pernyataan SQL seperti itu

SELECT a, lookupValue(b), c FROM customers 

di mana lookupValueakan 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:

  • tidak dapat membuat perubahan permanen
  • tidak dapat mengubah data

prosedur tersimpan dapat melakukan hal-hal itu.

Bagi saya penggunaan sebaris UDF adalah penggunaan paling penting dari UDF.

OpenSource
sumber
14

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.

Tigerjz32
sumber
2
Ini adalah ringkasan yang bagus dari keduanya, cara cepat dan kotor untuk memikirkan mereka.
Eric Bishard
2
Memang ringkasan yang bagus. Jawaban lain fokus pada perbedaan teoretis keduanya, sambil tetap membuat saya tidak yakin kapan harus menggunakan yang mana dalam praktik.
jf328
8

Prosedur tersimpan:

  • Seperti program miniatur di SQL Server.
  • Dapat sesederhana pernyataan pilih, atau serumit skrip panjang yang menambahkan, menghapus, memperbarui, dan / atau membaca data dari beberapa tabel dalam database.
  • (Dapat menerapkan loop dan kursor, yang keduanya memungkinkan Anda untuk bekerja dengan hasil yang lebih kecil atau operasi baris demi baris pada data.)
  • Harus dipanggil menggunakan EXECatauEXECUTE pernyataan.
  • Mengembalikan variabel tabel, tapi kami tidak bisa menggunakan OUT parameter.
  • Mendukung transaksi.

Fungsi:

  • Tidak dapat digunakan untuk memperbarui, menghapus, atau menambahkan catatan ke database.
  • Cukup mengembalikan nilai tunggal atau nilai tabel.
  • Hanya dapat digunakan untuk memilih catatan. Namun, ini dapat dipanggil dengan sangat mudah dari dalam SQL standar, seperti:

    SELECT dbo.functionname('Parameter1')

    atau

    SELECT Name, dbo.Functionname('Parameter1') FROM sysObjects
  • Untuk operasi pilih sederhana yang dapat digunakan kembali, fungsi dapat menyederhanakan kode. Berhati-hatilah dalam menggunakan JOINklausa dalam fungsi Anda. Jika fungsi Anda memiliki JOINklausa dan Anda menyebutnya dari pernyataan pilih lain yang mengembalikan beberapa hasil, panggilan fungsi itu akan JOIN 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.

  • Mengembalikan nilai menggunakan OUTparameter.
  • Tidak mendukung transaksi.
Terima kasih
sumber
8

Fungsi Buatan Pengguna.

  1. Fungsi harus mengembalikan nilai.
  2. Hanya akan mengizinkan Pilih pernyataan, itu tidak akan memungkinkan kami untuk menggunakan pernyataan DML.
  3. Ini hanya akan mengijinkan parameter input, tidak mendukung parameter output.
  4. Itu tidak akan memungkinkan kita untuk menggunakan blok try-catch.
  5. Transaksi tidak diperbolehkan dalam fungsi.
  6. Kita hanya bisa menggunakan variabel tabel, itu tidak akan mengizinkan menggunakan tabel sementara.
  7. Prosedur Tersimpan tidak dapat dipanggil dari suatu fungsi.
  8. Fungsi dapat dipanggil dari pernyataan pilih.
  9. UDF dapat digunakan dalam klausa gabungan sebagai hasil yang ditetapkan.

Prosedur Tersimpan

  1. Prosedur Tersimpan mungkin atau tidak mengembalikan nilai.
  2. Dapat memiliki pernyataan pilih serta pernyataan DML seperti menyisipkan, memperbarui, menghapus, dan sebagainya
  3. Ini dapat memiliki parameter input dan output.
  4. Untuk penanganan pengecualian, kita dapat menggunakan blok uji coba.
  5. Dapat menggunakan transaksi dalam Prosedur Tersimpan.
  6. Dapat menggunakan variabel tabel maupun tabel sementara di dalamnya.
  7. Prosedur Tersimpan dapat memanggil fungsi.
  8. Prosedur tidak dapat dipanggil dari Select / Where / Having dan sebagainya pernyataan. Execute / Exec statement dapat digunakan untuk memanggil / menjalankan Stored Procedure.
  9. Prosedur tidak dapat digunakan dalam klausa Gabung
Mahesh Waghmare
sumber
6

Untuk memutuskan kapan harus menggunakan apa yang mungkin membantu poin-poin berikut-

  1. Prosedur yang disimpan tidak dapat mengembalikan variabel tabel di mana fungsi dapat melakukannya.

  2. Anda dapat menggunakan prosedur tersimpan untuk mengubah parameter lingkungan server di mana menggunakan fungsi yang tidak bisa dilakukan.

Bersulang

Arnkrishn
sumber
6

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.

  1. Jangan pernah menggunakan fungsi untuk mengembalikan set hasil ke kode eksternal (seperti ADO.Net)
  2. Gunakan kombinasi tampilan / procs tersimpan sebanyak mungkin. Anda dapat pulih dari masalah kinerja pertumbuhan masa depan menggunakan saran DTA (Penasihat Basis Data Tuning) akan memberi Anda (seperti tampilan indeks dan statistik) - kadang-kadang!

untuk referensi lebih lanjut lihat: http://databases.aspfaq.com/database/should-i-use-a-view-a-stored-procedure-atau--user-defined-fungsi.html

Achilles
sumber
1
Terima kasih. Menulis fungsi hari ini untuk memanggil dalam kueri untuk mengisi nilai untuk satu kolom. Jalankan berlari selama lebih dari 3 menit sebelum saya menghentikannya. Mencari cara GABUNG untuk melakukannya. Jalankan selesai dalam 15 detik. (Kumpulan data adalah 3456 baris). Perbedaan kinerja besar.
VISQL
sunting: Jalankan selesai antara 15 dan 50 detik tergantung pada kolom I "ORDER BY" (Kumpulan data adalah 3456 baris). Perbedaan kinerja yang besar.
VISQL
Perbedaan kinerja mungkin memiliki akar pada berbagai jenis kolom yang Anda pesan hasilnya. SQL Server bekerja lebih baik dengan angka daripada data karakter. Anda dapat menggunakan DTA pada permintaan 50 detik itu dan melihat apakah itu dapat muncul dengan semacam statistik / saran indeks untuk membuat kueri berjalan sedikit lebih cepat.
Achilles
1
Saya tidak yakin cukup bukti telah diberikan untuk mengatakan bahwa itu harus menjadi pilihan terakhir. Anda dapat menganggap suatu fungsi sebagai tampilan parameter yang dapat dioperasikan lebih lanjut. Misalnya, Anda ingin bergabung dengan pelanggan untuk memesan, tetapi hanya untuk michigan. Anda membuat fungsi customerOrders (@StateCode) yang hanya akan bergabung dengan nilai pelanggan satu negara. Kemudian, saya dapat beroperasi lebih jauh pada set ini sebagai Select FirstName, LastName, OrderTotal, StoreName From CustomerOrders ('MI') INNER JOIN Stores ON Stores.StoreID = Pemesanan.StoreID WHERE OrderTotal> 100; Ini akan merepotkan dengan SP karena Anda harus menyalin.
MPavlak
Berapa banyak catatan yang Anda miliki di tabel itu? Jika perangkat keras Anda menanganinya dengan benar, Anda tidak perlu khawatir memilih senjata. Sendok dapat melakukan pekerjaan ketika cukup sulit untuk mematahkan pedang; kekerasan ini disebut PERANGKAT KERAS!
Achilles
3

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.

Andrew
sumber
3

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 execpernyataan 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 )

pengguna2023861
sumber
2
  • Merupakan keharusan bagi Function untuk mengembalikan nilai saat itu bukan untuk prosedur tersimpan.
  • Pilih pernyataan yang hanya diterima di UDF sedangkan pernyataan DML tidak diperlukan.
  • Prosedur tersimpan menerima pernyataan apa pun serta pernyataan DML.
  • UDF hanya memungkinkan input dan bukan output.
  • Prosedur tersimpan memungkinkan input dan output.
  • Blok penangkap tidak dapat digunakan dalam UDF tetapi dapat digunakan dalam prosedur tersimpan.
  • Tidak ada transaksi yang diizinkan dalam fungsi di UDF tetapi dalam prosedur tersimpan, mereka diizinkan.
  • Hanya variabel tabel yang dapat digunakan dalam UDF dan bukan tabel sementara.
  • Prosedur tersimpan memungkinkan untuk variabel tabel dan tabel sementara.
  • UDF tidak mengizinkan prosedur tersimpan dipanggil dari fungsi sementara prosedur tersimpan memungkinkan pemanggilan fungsi.
  • UDF digunakan dalam klausa gabungan sementara prosedur tersimpan tidak dapat digunakan dalam klausa gabungan.
  • Prosedur tersimpan akan selalu memungkinkan untuk kembali ke nol. UDF, sebaliknya, memiliki nilai yang harus kembali ke titik yang telah ditentukan.
kombsh
sumber
1
  • 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.

Nick Kahn
sumber
1

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 ...

  1. Skalar:

    CREATE FUNCTION ... RETURNS scalar_type AS BEGIN ... END

  2. Multi-pernyataan bernilai tabel:

    CREATE FUNCTION ... RETURNS @r TABLE(...) AS BEGIN ... END

  3. 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:

  • Perencana kueri dapat mengoptimalkan eksekusi fungsi sebaris seperti halnya sub-kueri lainnya (mis. Menghilangkan kolom yang tidak digunakan, mendorong predikat ke bawah, memilih berbagai strategi GABUNG, dll.).
  • Menggabungkan beberapa fungsi sebaris tidak membutuhkan mematerialisasi hasil dari yang pertama sebelum diumpankan ke yang berikutnya.

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.

Branko Dimitrijevic
sumber
-2

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:

  1. Sistem didefinisikan

  2. 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:

  1. Prosedur yang Disimpan Sistem
  2. Prosedur Buatan Pengguna
Jason Clark
sumber