Perdoe-me, sou um desenvolvedor que se mudou para o mundo do SQL. Eu pensei que poderia melhorar um pouco de 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 as razões pelas quais isso não funciona como imagino que deva, pois tenho certeza de que há uma boa razão, mas, atualmente, não me ocorre.
DECLARE @DatabaseName varchar(150)
SET @DatabaseName = 'MyAmazingDatabaseName'
CREATE DATABASE @DatabaseName
GO
USE @DatabaseName
GO
sql-server-2008
t-sql
gareth
fonte
fonte
USE
comando com um parâmetroGO
, a variável declarada anteriormente desaparece. Você pode querer analisar as variáveis SQLCMD, que podem ou não ser aplicáveis ao seu cenário.Respostas:
De acordo com a página online do Books para variáveis
Funcionaria da maneira que você esperava se, por exemplo, você usasse sua variável em uma cláusula where. Quanto ao porquê, eu acho que tem algo a ver com o analisador que não é 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.
fonte
eval
funções em linguagens procedurais como JavaScript e Python. É uma maneira rápida de criar falhas de segurança.As limitações no uso de variáveis nas instruções SQL surgem da arquitetura do SQL.
Existem três fases no processamento de uma instrução SQL:
O servidor SQL oculta a etapa de preparação do programador e a executa muito mais rapidamente do que os bancos de dados mais tradicionais, como Oracle e DB2. É por razões de desempenho que o SQL gasta potencialmente muito tempo determinando um plano de execução ideal, mas somente na primeira vez que a instrução é encontrada após uma reinicialização.
Portanto, no SQL estático , as variáveis podem ser usadas apenas 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 nas 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 malicioso, portanto, tome cuidado!
fonte
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 :
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)):
Novamente, cada uma delas tem uma centena de nuances nas quais não vou entrar aqui.
fonte
Você precisa usar sql dinâmico
abaixo está o resultado da impressão .. depois de descomentar,
exec sp_executesql @sqltext
as instruções serão realmente executadas ...fonte