Jak widać, pytanie „dlaczego” wymaga innego rodzaju odpowiedzi, w tym uzasadnienia historycznego i podstawowych założeń dotyczących języka, nie jestem pewien, czy naprawdę mogę oddać sprawiedliwość.
Ten obszerny artykuł autorstwa SQL MVP Erlanda Sommarskoga zawiera uzasadnienie wraz z mechaniką:
Klątwa i błogosławieństwa dynamicznego SQL :
Plany zapytań w pamięci podręcznej
Każde zapytanie uruchamiane w SQL Server wymaga planu zapytań. Gdy uruchamiasz zapytanie po raz pierwszy, SQL Server tworzy dla niego plan zapytań - lub, zgodnie z terminologią - kompiluje zapytanie. Program SQL Server zapisuje plan w pamięci podręcznej, a przy następnym uruchomieniu zapytania plan zostanie ponownie użyty.
To (i bezpieczeństwo, patrz poniżej) jest prawdopodobnie największym powodem.
SQL działa przy założeniu, że zapytania nie są operacjami jednorazowymi, ale będą używane w kółko. Jeśli tabela (lub baza danych!) Nie jest faktycznie określona w zapytaniu, nie ma możliwości wygenerowania i zapisania planu wykonania do wykorzystania w przyszłości.
Tak, nie każde uruchamiane przez nas zapytanie zostanie ponownie użyte, ale jest to domyślna przesłanka działania SQL , więc „wyjątki” mają być wyjątkowe.
Kilka innych powodów, dla których Erland wymienia (zauważ, że wyraźnie wymienia zalety korzystania z procedur przechowywanych , ale wiele z nich to także zalety sparametryzowanych (niedynamicznych) zapytań):
- System uprawnień : aparat SQL nie jest w stanie przewidzieć, czy masz uprawnienia do uruchomienia zapytania, jeśli nie zna tabeli (lub bazy danych), z którą będziesz działał. „Łańcuchy uprawnień” za pomocą dynamicznego SQL są uciążliwe.
- Zmniejszenie ruchu w sieci : przekazanie nazwy przechowywanego proc i kilku wartości parametrów przez sieć jest krótsze niż długie zapytanie.
- Enkapsulacja logiki : powinieneś zapoznać się z zaletami enkapsulacji logiki z innych środowisk programowania.
- Śledzenie, co jest używane : Jeśli muszę zmienić definicję kolumny, jak mogę znaleźć cały kod, który ją wywołuje? Istnieją procedury systemowe do znajdowania zależności w bazie danych SQL, ale tylko wtedy, gdy kod znajduje się w procedurach przechowywanych.
- Łatwość pisania kodu SQL : sprawdzanie składni następuje podczas tworzenia lub modyfikowania procedury składowanej, więc mam nadzieję, że będzie mniej błędów.
- Rozwiązywanie problemów i problemów : DBA może znacznie łatwiej śledzić i mierzyć wydajność poszczególnych procedur przechowywanych niż zmieniający się dynamiczny SQL.
Ponownie, każdy z nich ma sto niuansów, których nie będę tu wchodził.