Comme vous pouvez le voir, la question du «pourquoi» nécessite un type de réponse différent, y compris une justification historique et des hypothèses sous-jacentes à la langue, je ne suis pas sûr de pouvoir vraiment rendre justice.
Cet article complet par SQL MVP Erland Sommarskog tente de fournir une justification, ainsi que la mécanique:
La malédiction et les bénédictions du SQL dynamique :
Plans de requête de mise en cache
Chaque requête que vous exécutez dans SQL Server nécessite un plan de requête. Lorsque vous exécutez une requête pour la première fois, SQL Server crée un plan de requête pour celle-ci - ou, selon la terminologie, il compile la requête. SQL Server enregistre le plan dans le cache et la prochaine fois que vous exécutez la requête, le plan est réutilisé.
Ceci (et la sécurité, voir ci-dessous) est probablement la principale raison.
SQL fonctionne en partant du principe que les requêtes ne sont pas des opérations ponctuelles, mais qu'elles seront utilisées à plusieurs reprises. Si la table (ou la base de données!) N'est pas réellement spécifiée dans la requête, elle n'a aucun moyen de générer et d'enregistrer un plan d'exécution pour une utilisation future.
Oui, toutes les requêtes que nous exécutons ne seront pas réutilisées, mais c'est la prémisse d'exploitation par défaut de SQL , donc les "exceptions" sont censées être exceptionnelles.
Erland énumère quelques autres raisons (notez qu'il énumère explicitement les avantages de l'utilisation des procédures stockées , mais beaucoup d'entre elles sont également des avantages des requêtes paramétrées (non dynamiques)):
- Le système d'autorisation : le moteur SQL ne peut pas prédire si vous avez le droit d'exécuter une requête s'il ne connaît pas la table (ou la base de données) sur laquelle vous allez opérer. Les "chaînes d'autorisations" utilisant le SQL dynamique sont une douleur dans le cul.
- Réduction du trafic réseau : la transmission du nom du proc stocké et de quelques valeurs de paramètres sur le réseau est plus courte qu'une longue requête.
- Encapsulation de la logique : vous devez être familiarisé avec les avantages de l'encapsulation de la logique à partir d'autres environnements de programmation.
- Garder une trace de ce qui est utilisé : Si je dois changer une définition de colonne, comment puis-je trouver tout le code qui l'appelle? Il existe des procédures système pour rechercher des dépendances dans une base de données SQL, mais uniquement si le code se trouve dans des procédures stockées.
- Facilité d'écriture de code SQL : la vérification de la syntaxe se produit lorsque vous créez ou modifiez une procédure stockée, donc, espérons-le, moins d'erreurs en résultent.
- Résolution des bogues et des problèmes : un administrateur de base de données peut tracer et mesurer les performances de chaque procédure stockée beaucoup plus facilement que le SQL dynamique en constante évolution.
Encore une fois, chacun d'eux a cent nuances que je n'entrerai pas ici.