Як бачите, на питання "чому" потрібен різний вид відповіді, включаючи історичне обгрунтування та основні припущення щодо мови, я не впевнений, що я справді можу це зробити справедливим.
Ця вичерпна стаття SQL MVP Ерланда Соммарського намагається надати деякі обгрунтування разом з механікою:
Прокляття та благословення динамічного SQL :
Планування запитів кешування
Кожен запит, запущений у SQL Server, вимагає план запитів. Коли ви запускаєте запит вперше, SQL Server будує план запитів для нього - або в міру термінології - він збирає запит. SQL Server зберігає план у кеші, і при наступному запуску запиту план буде повторно використаний.
Це (та безпека, див. Нижче), мабуть, найбільша причина.
SQL працює за умови, що запити не є одноразовими операціями, але вони будуть використовуватися знову і знову. Якщо таблиця (або база даних!) Насправді не вказана в запиті, вона не може створити та зберегти план виконання для подальшого використання.
Так, не кожен запит, який ми запускаємо, буде повторно використаний, але це операційна передумова SQL за замовчуванням , тому "винятки" мають бути винятковими.
Кілька інших причин Ерланд перераховує (зауважте, що він чітко перераховує переваги використання збережених процедур , але багато з них є також перевагами параметризованих (нединамічних) запитів):
- Система дозволів : двигун SQL не може передбачити, чи є у вас права на виконання запиту, якщо він не знає таблиці (або бази даних), над якою будете працювати. "Ланцюги дозволів", що використовують динамічний SQL, - це біль в області прикладу.
- Зменшення мережевого трафіку : передавання імені збереженого протоколу та кількох значень параметрів по мережі коротше, ніж тривале повідомлення запиту.
- Інкапсуляція логіки : Вам слід ознайомитись з перевагами логіки інкапсуляції з інших середовищ програмування.
- Відстеження того, що використовується : Якщо мені потрібно змінити визначення стовпця, як я можу знайти весь код, який його викликає? Системні процедури існують для пошуку залежностей у базі даних SQL, але лише якщо код знаходиться в збережених процедурах.
- Простота написання коду SQL : Перевірка синтаксису відбувається під час створення або зміни збереженої процедури, тому, сподіваємось, зменшиться кількість помилок.
- Вирішення помилок та проблем : DBA може відстежувати та вимірювати ефективність окремих зберігаються процедур набагато легше, ніж динамічний SQL, що постійно змінюється.
Знову ж таки, у кожного з них є сто нюансів, я тут не потрапляю.