Dalam SQL Server, apa tujuan dari pengelompokan prosedur tersimpan?

35

Salah satu masalah paling membingungkan yang harus saya hadapi berkaitan dengan kelompok Prosedur yang Disimpan. Diberikan prosedur tersimpan usp_DoSomethingAwesome,, saya dapat membuat proc itu di grup lain dengan memanggilnya usp_DoSomethingAwesome;2.

Saya menemukan ini ketika pemecahan masalah beberapa masalah replikasi (Penerbit: SQL 2000 Ent., Dist / Sub: 2008 R2 Ent.) Yang muncul dengan beberapa sisipan yang dihasilkan sistem, perbarui, dan Hapus prosedur tersimpan replikasi.

Apa tujuan / pemikiran di balik memiliki kemampuan "pengelompokan" ini?

swasheck
sumber

Jawaban:

32

Ini seperti kelebihan metode. Pada dasarnya Anda dapat membuat dua atau lebih versi dari prosedur tersimpan Anda, di mana masing-masing melakukan hal yang berbeda - ambil sejumlah parameter yang berbeda, beroperasi pada tabel yang berbeda, memiliki keluaran yang berbeda, dll.

Mereka disebut Prosedur Bernomor dan mereka benar-benar usang ( diumumkan sejak 2005 ). Mereka masih didukung di SQL Server 2012, tetapi beberapa fitur tidak bisa dimainkan dengan baik. Misalnya, mereka dianggap sebagai pelanggaran penahanan dalam Database yang Terkandung, dan prosedur apa pun yang bernomor> 1 tidak akan dibuat:

Msg 12829, Level 16, Negara 1, Blat prosedur, Baris 1
Prosedur tersimpan 'dbo.blat' mengacu pada sekelompok prosedur tersimpan bernomor. Prosedur tersimpan bernomor tidak tersedia di database yang terkandung. Silakan baca topik Buku Daring Memahami Database yang Terkandung untuk informasi lebih lanjut tentang database yang terkandung.

Aaron Bertrand
sumber
5

Kemampuan (usang) untuk mengelompokkan Prosedur yang Disimpan tampaknya ada untuk satu tujuan (dan agak konyol): kemampuan untuk menghapus secara massal melalui DROPpernyataan tunggal . Menurut dokumentasi SQL Server 2000 MSDN untuk Membuat Prosedur yang Disimpan :

Pengelompokan
Prosedur dapat dibuat dengan nama yang sama dengan prosedur tersimpan yang ada jika diberikan nomor identifikasi yang berbeda, yang memungkinkan prosedur dikelompokkan secara logis. Prosedur pengelompokan dengan nama yang sama memungkinkannya dihapus pada saat bersamaan. Prosedur yang digunakan dalam aplikasi yang sama sering dikelompokkan dengan cara ini. Misalnya, prosedur yang digunakan dengan aplikasi my_app mungkin dinamai my_proc; 1, my_proc; 2 , dan seterusnya. Menghapus my_proc menghapus seluruh grup. Setelah prosedur dikelompokkan, prosedur individual dalam grup tidak dapat dihapus.

Tidak ada manfaat tambahan untuk menggunakan konstruksi ini mengingat bahwa menggunakan nama dasar yang sama bahkan tidak memungkinkan overloading (tanda tangan tidak perlu unik, dan tidak ada routing eksekusi otomatis ke "angka" tertentu) sehingga Anda masih perlu gunakan "angka" saat mengeksekusi. Oleh karena itu penentuan "konyol" (dan itu mungkin terlalu baik tentang hal itu ;-).

Solomon Rutzky
sumber