Tidak ada cara yang baik untuk melakukan itu. Ini adalah batasan prosedur tersimpan. Pilihan Anda adalah:
-
Alihkan prosedur ke Fungsi Buatan Pengguna . Di seluruh dunia, saat ini, orang membuat prosedur tersimpan yang seharusnya berfungsi. Ini masalah pendidikan. Situasi Anda adalah contoh yang baik mengapa. Jika prosedur Anda adalah UDF, Anda cukup melakukan hal berikut, persis seperti yang Anda pikir secara intuitif seharusnya dapat Anda lakukan:
SELECT * FROM udf_who2() WHERE login='bmccormack'
-
Jika Anda benar-benar tidak dapat menyentuh prosedur Anda, dan harus lakukan ini di sql, maka Anda harus menjadi funky. Buat prosedur tersimpan lain untuk membungkus prosedur asli Anda. Di dalam prosedur baru Anda, panggil prosedur yang ada dan masukkan nilainya ke dalam tabel sementara, lalu jalankan kueri terhadap tabel tersebut dengan filter yang Anda inginkan, dan kembalikan hasilnya ke dunia luar.
Dimulai dengan SQL server 2005, fungsi yang ditentukan pengguna adalah cara Anda merangkum pengambilan data. Prosedur Tersimpan, bersama dengan Tampilan, adalah alat khusus untuk digunakan dalam situasi tertentu. Keduanya sangat berguna pada waktu yang tepat, tetapi bukan pilihan pertama. Beberapa orang mungkin berpikir bahwa contoh di atas (A) mendapatkan semua hasil dari fungsi dan kemudian (B) memfilter pada hasil tersebut, seperti subquery. Ini bukan masalahnya . SQL server 2005+ mengoptimalkan kueri itu; jika ada indeks di login
, Anda tidak melihat pemindaian tabel dalam rencana eksekusi kueri; sangat efisien.
Sunting :Saya harus menambahkan bahwa jeroan UDF mirip dengan SP. Jika itu mengacaukan logika dari SP yang ingin Anda hindari, Anda masih dapat mengubahnya menjadi suatu fungsi. Beberapa kali saya mengambil kode prosedur besar dan menakutkan yang tidak ingin saya pahami, dan berhasil mentransfernya ke suatu fungsi. Satu-satunya masalah adalah jika prosedur diubah apa pun selain mengembalikan hasil; UDF tidak dapat mengubah data dalam db.