Seperti yang Anda lihat, pertanyaan "mengapa" membutuhkan jawaban yang berbeda, termasuk pemikiran historis dan asumsi yang mendasari bahasa tersebut, saya tidak yakin saya benar-benar dapat melakukan keadilan itu.
Artikel komprehensif ini oleh SQL MVP Erland Sommarskog tidak mencoba memberikan beberapa alasan, bersama dengan mekanika:
Kutukan dan Berkat dari Dynamic SQL :
Paket Permintaan Caching
Setiap kueri yang Anda jalankan di SQL Server membutuhkan rencana kueri. Ketika Anda menjalankan kueri pertama kali, SQL Server membangun rencana kueri untuk itu - atau seiring terminologi - mengkompilasi kueri. SQL Server menyimpan paket dalam cache, dan lain kali Anda menjalankan kueri, paket tersebut digunakan kembali.
Ini (dan keamanan, lihat di bawah) mungkin merupakan alasan terbesar.
SQL beroperasi di bawah premis bahwa query bukan operasi satu kali, tetapi mereka akan digunakan berulang kali. Jika tabel (atau database!) Sebenarnya tidak ditentukan dalam kueri, itu tidak memiliki cara untuk menghasilkan dan menyimpan rencana eksekusi untuk digunakan di masa depan.
Ya, tidak setiap kueri yang kami jalankan akan digunakan kembali, tetapi ini adalah premis operasi standar dari SQL , jadi "pengecualian" dimaksudkan untuk menjadi luar biasa.
Beberapa alasan lain daftar Erland (perhatikan bahwa ia secara eksplisit mencantumkan keuntungan menggunakan prosedur yang tersimpan , tetapi banyak di antaranya juga keuntungan dari kueri parameterisasi (non-dinamis)):
- Sistem Izin : mesin SQL tidak dapat memprediksi apakah Anda memiliki hak untuk menjalankan kueri jika tidak tahu tabel (atau database) yang akan Anda gunakan untuk melawannya. "Rantai izin" menggunakan SQL dinamis adalah rasa sakit di pantat.
- Mengurangi Lalu Lintas Jaringan : Melewati nama proc yang disimpan dan beberapa nilai parameter di jaringan lebih pendek daripada pernyataan kueri yang panjang.
- Encapsulating Logic : Anda harus terbiasa dengan keuntungan dari enkapsulasi logika dari lingkungan pemrograman lain.
- Melacak Apa yang Digunakan : Jika saya perlu mengubah definisi kolom, bagaimana saya bisa menemukan semua kode yang memanggilnya? Prosedur sistem ada untuk menemukan dependensi dalam database SQL, tetapi hanya jika kode tersebut dalam prosedur tersimpan.
- Kemudahan Menulis Kode SQL : Pemeriksaan sintaksis terjadi ketika Anda membuat atau memodifikasi prosedur yang tersimpan, jadi semoga lebih sedikit kesalahan yang terjadi.
- Mengatasi Bug dan Masalah : DBA dapat melacak dan mengukur kinerja masing-masing prosedur tersimpan jauh lebih mudah daripada SQL dinamis yang selalu berubah.
Sekali lagi, masing-masing memiliki seratus nuansa yang tidak akan saya bahas di sini.