Como você pode ver, a pergunta "por que" requer um tipo diferente de resposta, incluindo a justificativa histórica e as suposições subjacentes ao idioma, não tenho certeza de que possa realmente fazer essa justiça.
Este artigo abrangente do MVP do SQL Erland Sommarskog tenta fornecer algumas justificativas, junto com a mecânica:
A maldição e as bênçãos do SQL dinâmico :
Cache de planos de consulta
Toda consulta que você executa no SQL Server requer um plano de consulta. Quando você executa uma consulta pela primeira vez, o SQL Server cria um plano de consulta para ela - ou conforme a terminologia - compila a consulta. O SQL Server salva o plano no cache e, da próxima vez que você executar a consulta, o plano será reutilizado.
Este (e segurança, veja abaixo) é provavelmente o maior motivo.
O SQL opera sob a premissa de que as consultas não são operações únicas, mas que serão usadas repetidamente. Se a tabela (ou o banco de dados!) Não estiver realmente especificada na consulta, ela não poderá gerar e salvar um plano de execução para uso futuro.
Sim, nem todas as consultas que executamos serão reutilizadas, mas essa é a premissa operacional padrão do SQL , portanto, as "exceções" devem ser excepcionais.
Algumas outras razões pelas quais Erland lista (observe que ele lista explicitamente as vantagens de usar procedimentos armazenados , mas muitos deles também são vantagens de consultas parametrizadas (não dinâmicas)):
- O sistema de permissão : o mecanismo SQL não pode prever se você tem o direito de executar uma consulta se não souber a tabela (ou banco de dados) em que estará operando. "Cadeias de permissão" usando SQL dinâmico é um problema.
- Reduzindo o tráfego de rede : passar o nome do processo armazenado e alguns valores de parâmetro na rede é mais curto que uma declaração de consulta longa.
- Lógica de encapsulamento : você deve estar familiarizado com as vantagens de encapsular a lógica de outros ambientes de programação.
- Acompanhar o que é usado : Se eu precisar alterar uma definição de coluna, como posso encontrar todo o código que a chama? Os procedimentos do sistema existem para localizar dependências em um banco de dados SQL, mas apenas se o código estiver em procedimentos armazenados.
- Facilidade de escrever código SQL : a verificação de sintaxe ocorre quando você cria ou modifica um procedimento armazenado, resultando em menos erros.
- Resolvendo Bugs e Problemas : Um DBA pode rastrear e medir o desempenho de procedimentos armazenados individuais com muito mais facilidade do que o SQL dinâmico em constante mudança.
Novamente, cada uma delas tem uma centena de nuances nas quais não vou entrar aqui.