Não (SQL Server Management Studio ou SQL Server) avaliar *todas* as expressões?
-
26-09-2019 - |
Pergunta
Aqui está a minha configuração:
- Eu tenho um re-runnable batch script que eu uso para atualizar meu banco de dados.
- Dentro do script em lotes, eu tenho um código que diz o seguinte:
- Se a Tabela " A " não existir, crie a Tabela 'A' e inserir linhas no mesmo.
- Mais tarde, em que o script em lotes, criar um schemabound modo de exibição indexado nessa tabela.
- E se você já não soubesse, modos de exibição indexados requerem configurações do cliente.
Às vezes, quando eu re-executar o script, que é depois de criada a tabela, o SQL Server Management Studio avalia a "inserir linhas de código", que é protegido pelo "Se esta tabela não existe' código, e produz o seguinte erro:
Erro De 1934, Nível De 16, Estado 1, Linha 15 INSERT falhou porque as seguintes opções SET têm configurações incorretas:'CONCAT_NULL_YIELDS_NULL, ANSI_WARNINGS, ANSI_PADDING, ARITHABORT'.Verifique que o CONJUNTO de opções estão corretas para o uso com modos de exibição indexados e/ou índices em colunas computadas e/ou índices filtrados e/ou notificações de consulta e/ou de tipo de dados XML de métodos e/ou espacial do índice de operações.
- Por favor, note:Se alguém tentar esta instrução de INSERÇÃO no vácuo, eu seria totalmente esperar O SSMS para gerar este erro.
- Mas não quando ela está protegida por um bloco condicional.
Minha Pergunta:
O SSMS compilador avaliar todos expressões, independentemente de se eles vão realmente ser executado?
Solução
Sim, ele avalia todos eles,dê uma olhada neste
declare @i int
select @i =1
if @i = 1
begin
declare @i2 int
set @i2 = 5
end
else
begin
declare @i2 int
set @i2 = 5
end
Erro 134, Nível De 15, Estado 1, Linha 12 O nome da variável '@i2' já foi declarado.Nomes de variáveis devem ser exclusivos dentro de um processo de consulta ou procedimento armazenado.
Outro exemplo com tabelas temporárias, está aqui: O que é resolução de nome adiada e por que você precisa de cuidados?
sua única saída seria a envolvê-la dentro de SQL dinâmico
Outras dicas
Observe que a maioria das configurações que você menciona é no nível da conexão, ou seja, caso você as altere/altere, elas permanecem em vigor, a menos que você feche a conexão ou altere explicitamente o valor deles.
Retornando à sua pergunta. O erro que você menciona parece um erro de tempo de execução, ou seja, a inserção está realmente sendo executada. Seria melhor se você pudesse mostrar seu script (omitindo detalhes, mas mantendo lotes).
EDIT: Não é o SSMS Compiler que avalia o SQL que você tenta executar - é o SQL Server. O que você quis dizer com 'avaliar'? É 'executar'? Quando você executa um lote (que é o que realmente está sendo executado por um servidor), o SQL Server primeiro faz análise sintática e lança erro, caso encontre algum sintático Erro, nada está sendo executado neste momento. Caso a sintaxe esteja OK, o servidor começa a executar seu lote.
Novamente, o erro que você mostra parece ser tempo de execução - Então eu acho que você cuidou cuidadosamente das condições e rastreia o que acontece (ou nos forneceria mais detalhes sobre 'às vezes').