O SQL Server relata 'Nome de coluna inválido', mas a coluna está presente e a consulta funciona por meio do Management Studio

107

Eu cheguei a um pequeno impasse. Eu tenho uma consulta que é gerada por algum C#código. A consulta funciona bem Microsoft SQL Server Management Studioquando executada no mesmo banco de dados.

No entanto, quando meu código tenta executar a mesma consulta, recebo o mesmo erro sobre uma coluna inválida e uma exceção é lançada. Todas as consultas que fazem referência a esta coluna estão falhando.

A coluna em questão foi adicionada recentemente ao banco de dados. É uma coluna de data chamada Incident_Begin_Time_ts.

Um exemplo que falha é:

select * from PerfDiag 
where Incident_Begin_Time_ts > '2010-01-01 00:00:00';

Outras consultas como Select MAX(Incident_Being_Time_ts);também falham quando executadas no código porque pensa que a coluna está ausente.

Alguma ideia?

kidl33t
fonte
É um problema com o caso, talvez? Talvez o Management Studio não se importe com o caso, enquanto outras maneiras de acessar o banco de dados são mais restritas.
Oliver
1
Tem certeza de que está lidando com o mesmo banco de dados em seu código que o do Management Studio?
rlb.usa
3
Tem certeza de que o nome da coluna que você criou em C # e o nome da coluna que você tenta consultar são exatamente os mesmos? Em sua pergunta, você está escrevendo duas vezes 'Incident _ Begin _ Time_ts' e uma vez 'Incident _ Being _ Time_ts'.
Christian Specht
1
@Oliver: a distinção entre maiúsculas e minúsculas não é por conexão. É uma opção de servidor de banco de dados / sql.
Nicholas Carey

Respostas:

65

Suspeito que você tenha duas tabelas com o mesmo nome. Um pertence ao esquema 'dbo' ( dbo.PerfDiag) e o outro pertence ao esquema padrão da conta usada para se conectar ao SQL Server (algo semelhante userid.PerfDiag).

Quando você tem uma referência não qualificada a um objeto de esquema (como uma tabela) - um não qualificado pelo nome do esquema - a referência do objeto deve ser resolvida. A resolução de nomes ocorre pesquisando na seqüência a seguir por um objeto do tipo apropriado (tabela) com o nome especificado. O nome resolve para a primeira correspondência:

  • Sob o esquema padrão do usuário.
  • Sob o esquema 'dbo'.

A referência não qualificada é vinculada à primeira correspondência na sequência acima.

Como prática geral recomendada, deve-se sempre qualificar referências a objetos de esquema, por motivos de desempenho:

  • Uma referência não qualificada pode invalidar um plano de execução em cache para o procedimento armazenado ou consulta, já que o esquema ao qual a referência foi associada pode mudar dependendo das credenciais que executam o procedimento armazenado ou consulta. Isso resulta na recompilação da consulta / procedimento armazenado, um impacto no desempenho. Recompilações fazem com que bloqueios de compilação sejam retirados, impedindo que outros acessem o (s) recurso (s) necessário (s).

  • A resolução de nomes retarda a execução da consulta, pois duas sondagens devem ser feitas para resolver a versão provável do objeto (que pertence a 'dbo'). Este é o caso usual. A única vez que uma única investigação resolverá o nome é se o usuário atual possuir um objeto com o nome e tipo especificados.

[Editado para nota posterior]

As outras possibilidades são (sem ordem específica):

  • Você não está conectado ao banco de dados que pensa que está.
  • Você não está conectado à instância do SQL Server que pensa que está.

Verifique novamente suas strings de conexão e certifique-se de que elas especifiquem explicitamente o nome da instância do SQL Server e o nome do banco de dados.

Nicholas Carey
fonte
4
+1 eu uso o sql profiler para rastrear esses tipos de problemas. Sempre que você lida com sql dinâmico de outros aplicativos, capture a consulta com um rastreamento, copie e cole em uma nova janela de consulta, clique em executar para descobrir o que está errado. Isso também validará se você está se conectando à instância e ao banco de dados corretos, conforme sugerido acima.
brian
2
... um pouco fora do tópico, mas se você estiver usando o profiler para reproduzir problemas de desempenho, lembre-se de incluir todas as opções definidas , particularmente ARITHABORT para duplicar verdadeiramente a consulta (e seu plano em cache)
Nick.McDermaid
Primeiro tente com Ctrl + Shift + R, para recarregar o cache. Na pior das hipóteses, você perde apenas alguns segundos.
radbyx
267

Basta pressionar Ctrl+ Shift+ Re ver ...

No SQL Server Management Studio, Ctrl + Shift + R atualiza o cache local.

Mangesh
fonte
Por que você acha que isso seria útil?
Amigável,
7
No SQL Server Management Studio, Ctrl + Shift + R atualiza o cache do Intellisense. Isso impediu o Management Studio de reclamar que as colunas que eu adicionei são inválidas, mas acho que foi uma dúvida (ainda tenho um problema, como o autor do pôster original, ao acessar essas novas colunas a partir do código).
Giles
2
Parece que sempre que adiciono-migração e, em seguida, atualizo o banco de dados, tenho que fazer isso. Caso contrário, percebo que é um nome de coluna inválido no MS SQL Server. Trabalho! Muito obrigado.
BriOnH
1
Parece que você terá que fazer isso sempre que criar uma mesa ou qualquer coisa desse tipo.
Sonny Childs de
1
Isso acima é normalmente a minha solução ideal quando coisas estranhas acontecem. Neste caso, porém, não resolveu o problema. Porém, reiniciar o SQL Studio resolveu o problema.
Dan Mehlqvist,
9

Se você estiver executando isso dentro de uma transação e uma instrução SQL antes de eliminar / alterar a tabela, você também pode obter esta mensagem.

Stagg
fonte
1
+1. Eu alterei uma tabela adicionando uma nova coluna e estava obtendo este erro na próxima instrução referenciando a nova coluna. Eu superei isso executando as instruções até a alteração da tabela de uma vez e o resto de outra. Não é a melhor das soluções, mas me desbloqueou. :)
Prasad Korhale de
3

Finalmente desliguei e reiniciei o Microsoft SQL Server Management Studio; e isso resolveu para mim. Mas em outras ocasiões, apenas iniciar uma nova janela de consulta era o suficiente.

IAM_AL_X
fonte
2

Se você estiver usando variáveis ​​com o mesmo nome de sua coluna, pode ser que você tenha esquecido o marcador de variável '@'. Em uma instrução INSERT, ele será detectado como uma coluna.

Dévan Coetzee
fonte
2

Apenas tive exatamente o mesmo problema. Renomei algumas colunas com alias em uma tabela temporária que é usada posteriormente por outra parte do mesmo código. Por algum motivo, isso não foi capturado pelo SQL Server Management Studio e ele se queixou de nomes de coluna inválidos.

O que eu simplesmente fiz foi criar uma nova consulta, copiar e colar o código SQL da consulta antiga para esta nova consulta e executá-la novamente. Isso pareceu refrescar o ambiente corretamente.

Torta de maçã
fonte
1

No meu caso, reinicio o Microsoft SQL Server Management Studio e isso funciona bem para mim.

Rexhi
fonte
0

No meu caso, estava tentando obter o valor do ResultSet errado ao consultar várias instruções SQL.

Deepak Kataria
fonte
0

No meu caso, parece que o problema era um problema estranho de cache. As soluções acima não funcionaram.

Se seu código estava funcionando bem e você adicionou uma coluna a uma de suas tabelas e deu o erro 'nome de coluna inválido', e as soluções acima não funcionaram, tente isto: Primeiro execute apenas a seção de código para criar aquela modificação tabela e, em seguida, execute todo o código.

LoMaPh
fonte
0

Incluindo esta resposta porque este foi o resultado principal para "sql de nome de coluna inválido" no google e não encontrei essa resposta aqui. No meu caso, estava recebendo o nome de coluna inválido, Id1, porque usei a id errada em minha instrução .HasForeignKey em meu código C # do Entity Framework. Depois de alterá-lo para corresponder ao id do objeto .HasOne (), o erro desapareceu.

Daniel
fonte
0

Recebi este erro ao executar uma função escalar usando um valor de tabela, mas a instrução Select em minha cláusula RETURN da função escalar estava faltando a parte "Tabela FROM". : facepalms:

cdabel
fonte
0

Também acontece quando você se esquece de mudar o ConnectionString e pergunta a uma mesa que não tem ideia sobre as mudanças que você está fazendo localmente.

Иво Недев
fonte