Perdoe-me, sou um desenvolvedor que mudou para o mundo do SQL. Achei que poderia melhorar um pouco do SQL adicionando variáveis, mas não funcionou como eu esperava. Alguém pode me dizer por que isso não funciona? Não quero uma solução alternativa, quero saber os motivos pelos quais isso não funciona como imagino que deveria, pois tenho certeza de que há um bom motivo, mas atualmente não salta para mim.
DECLARE @DatabaseName varchar(150)
SET @DatabaseName = 'MyAmazingDatabaseName'
CREATE DATABASE @DatabaseName
GO
USE @DatabaseName
GO
De acordo com a página on-line de livros para variáveis
Funcionaria da maneira que você esperava se, por exemplo, você usasse sua variável em uma cláusula where. Quanto ao motivo, acho que tem algo a ver com o analisador não ser capaz de avaliar a variável e, assim, verificar a existência. Ao executar, a consulta é analisada primeiro para sintaxe e objetos e, em seguida, se a análise for bem-sucedida, a consulta é executada no ponto em que a variável seria definida.
As limitações no uso de variáveis em instruções SQL surgem da arquitetura do SQL.
Existem três fases no processamento de uma instrução SQL:
O SQL Server esconde a etapa de preparação do programador e a executa muito mais rápido do que os bancos de dados mais tradicionais, como Oracle e DB2. É por motivos de desempenho que o SQL gasta potencialmente muito tempo determinando um plano de execução ideal, mas só o faz na primeira vez que a instrução é encontrada após uma reinicialização.
Portanto, no SQL estático , as variáveis só podem ser usadas em locais onde não invalidarão o plano de execução, portanto, não para nomes de tabelas, nomes de colunas (incluindo nomes de colunas em condições WHERE), etc.
O SQL dinâmico existe para os casos em que não é possível contornar as restrições, e o programador sabe que levará um pouco mais de tempo para executar. O SQL dinâmico pode ser vulnerável à injeção de código mal-intencionado, portanto, tome cuidado!
Como você pode ver, a pergunta "por que" requer um tipo diferente de resposta, incluindo lógica histórica e suposições subjacentes para o idioma, não tenho certeza se posso realmente fazer justiça a isso.
Este artigo abrangente do SQL MVP Erland Sommarskog tenta fornecer alguma justificativa, juntamente com a mecânica:
A maldição e as bênçãos do SQL dinâmico :
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 continuamente. Se a tabela (ou o banco de dados!) não for realmente especificada na consulta, não há como gerar e salvar um plano de execução para uso futuro.
Sim, nem todas as consultas executadas serão reutilizadas, mas essa é a premissa operacional padrão do SQL , portanto, "exceções" devem ser excepcionais.
Algumas outras razões listadas por Erland (observe que ele está listando explicitamente as vantagens de usar procedimentos armazenados , mas muitas delas também são vantagens de consultas parametrizadas (não dinâmicas)):
Novamente, cada um deles tem uma centena de nuances que não vou abordar aqui.
Você precisa usar sql dinâmico
abaixo está a saída de print .. assim que você descomentar
exec sp_executesql @sqltext
as instruções serão realmente executadas ...