Come puoi vedere, la domanda "perché" richiede un diverso tipo di risposta, tra cui la logica storica e le ipotesi alla base della lingua, non sono sicuro di poter davvero rendere giustizia.
Questo articolo completo di SQL MVP Erland Sommarskog tenta di fornire alcune motivazioni, insieme alla meccanica:
The Curse and Blessings of Dynamic SQL :
Piani di query nella cache
Ogni query eseguita in SQL Server richiede un piano di query. Quando si esegue una query per la prima volta, SQL Server crea un piano di query per esso - o secondo la terminologia - compila la query. SQL Server salva il piano nella cache e alla successiva esecuzione della query, il piano viene riutilizzato.
Questo (e la sicurezza, vedi sotto) è probabilmente il motivo principale.
SQL funziona con la premessa che le query non sono operazioni singole, ma che verranno utilizzate più e più volte. Se la tabella (o il database!) Non è effettivamente specificata nella query, non ha modo di generare e salvare un piano di esecuzione per uso futuro.
Sì, non tutte le query che eseguiremo verranno riutilizzate, ma questa è la premessa operativa predefinita di SQL , quindi "eccezioni" sono considerate eccezionali.
Alcuni altri motivi elencati da Erland (si noti che elenca esplicitamente i vantaggi dell'utilizzo di stored procedure , ma molti di questi sono anche vantaggi delle query con parametri (non dinamici):
- Il sistema di autorizzazione : il motore SQL non è in grado di prevedere se si dispone dei diritti per eseguire una query se non conosce la tabella (o il database) su cui si opererà. Le "catene di autorizzazioni" che usano l'SQL dinamico sono una seccatura.
- Riduzione del traffico di rete : il passaggio del nome del proc memorizzato e alcuni valori di parametro sulla rete sono più brevi di un'istruzione di query lunga.
- Logica incapsulante : dovresti conoscere i vantaggi dell'incapsulamento della logica da altri ambienti di programmazione.
- Tenere traccia di ciò che viene utilizzato : se devo modificare una definizione di colonna, come posso trovare tutto il codice che lo chiama? Esistono procedure di sistema per trovare dipendenze all'interno di un database SQL, ma solo se il codice è nelle stored procedure.
- Facilità di scrittura del codice SQL : il controllo della sintassi si verifica quando si crea o si modifica una procedura memorizzata, quindi si spera che si verifichino meno errori.
- Risoluzione di bug e problemi : un DBA può tracciare e misurare le prestazioni delle singole procedure memorizzate molto più facilmente rispetto all'SQL dinamico in continua evoluzione.
Ancora una volta, ognuna di queste ha cento sfumature che non entrerò qui.