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.
  • À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?

Foi útil?

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').

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top