Wie Sie sehen, erfordert die "Warum" -Frage eine andere Art von Antwort, einschließlich historischer Gründe und zugrunde liegender Annahmen für die Sprache. Ich bin mir nicht sicher, ob ich dieser Frage wirklich gerecht werden kann.
In diesem umfassenden Artikel von SQL MVP Erland Sommarskog wird versucht, einige Gründe zusammen mit den Mechanismen anzugeben:
Der Fluch und der Segen von Dynamic SQL :
Abfragepläne zwischenspeichern
Für jede Abfrage, die Sie in SQL Server ausführen, ist ein Abfrageplan erforderlich. Wenn Sie eine Abfrage zum ersten Mal ausführen, erstellt SQL Server einen Abfrageplan für diese Abfrage. Je nach Terminologie wird die Abfrage kompiliert. SQL Server speichert den Plan im Cache. Wenn Sie die Abfrage das nächste Mal ausführen, wird der Plan wiederverwendet.
Dies (und die Sicherheit, siehe unten) ist wahrscheinlich der Hauptgrund.
SQL geht davon aus, dass Abfragen keine einmaligen Vorgänge sind, sondern immer wieder verwendet werden. Wenn die Tabelle (oder die Datenbank!) Nicht tatsächlich in der Abfrage angegeben ist, kann kein Ausführungsplan für die zukünftige Verwendung generiert und gespeichert werden.
Ja, nicht jede Abfrage, die wir ausführen, wird wiederverwendet. Dies ist jedoch die Standardvoraussetzung für SQL , sodass "Ausnahmen" als außergewöhnlich angesehen werden.
Einige andere Gründe, die Erland aufführt (beachten Sie, dass er die Vorteile der Verwendung gespeicherter Prozeduren explizit auflistet , aber viele davon sind auch Vorteile parametrisierter (nicht dynamischer) Abfragen):
- Das Berechtigungssystem : Die SQL-Steuerkomponente kann nicht vorhersagen, ob Sie zum Ausführen einer Abfrage berechtigt sind, wenn sie die Tabelle (oder Datenbank) nicht kennt, mit der Sie arbeiten werden. "Berechtigungsketten" mit dynamischem SQL sind ein Problem.
- Reduzieren des Netzwerkverkehrs : Das Übergeben des Namens des gespeicherten Prozesses und einiger Parameterwerte über das Netzwerk ist kürzer als eine lange Abfrageanweisung.
- Kapselungslogik : Sie sollten mit den Vorteilen der Kapselung von Logik aus anderen Programmierumgebungen vertraut sein.
- Verfolgen, was verwendet wird : Wenn ich eine Spaltendefinition ändern muss, wie kann ich den gesamten Code finden, der sie aufruft? Systemprozeduren sind vorhanden, um Abhängigkeiten in einer SQL-Datenbank zu finden, jedoch nur, wenn sich der Code in gespeicherten Prozeduren befindet.
- Einfache Erstellung von SQL-Code : Die Syntaxprüfung erfolgt beim Erstellen oder Ändern einer gespeicherten Prozedur, sodass hoffentlich weniger Fehler auftreten.
- Beheben von Fehlern und Problemen : Ein DBA kann die Leistung einzelner gespeicherter Prozeduren viel einfacher verfolgen und messen als sich ständig änderndes dynamisches SQL.
Auch hier hat jede hundert Nuancen, auf die ich hier nicht eingehen werde.