SQL Server informa 'Nombre de columna no válido', pero la columna está presente y la consulta funciona a través de Management Studio

107

He llegado a un punto muerto. Tengo una consulta generada por algún C#código. La consulta funciona bien Microsoft SQL Server Management Studiocuando se ejecuta en la misma base de datos.

Sin embargo, cuando mi código intenta ejecutar la misma consulta, obtengo el mismo error sobre una columna no válida y se lanza una excepción. Todas las consultas que hacen referencia a esta columna fallan.

La columna en cuestión se agregó recientemente a la base de datos. Es una columna de fecha llamada Incident_Begin_Time_ts.

Un ejemplo que falla es:

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

Otras consultas como Select MAX(Incident_Being_Time_ts);también fallan cuando se ejecutan en código porque cree que falta la columna.

¿Algunas ideas?

kidl33t
fuente
¿Es un problema con el caso tal vez? Quizás a Management Studio no le importa el caso, mientras que otras formas de acceder a la base de datos son más estrictas.
Oliver
1
¿Está seguro de que está tratando con la misma base de datos en su código que en Management Studio?
rlb.usa
3
¿Está seguro de que el nombre de la columna que creó en C # y el nombre de la columna que intenta consultar son exactamente iguales? En su pregunta, escribe dos veces 'Incidente _ Comienzo _ Hora_t' y una vez 'Incidente _ Siendo _ Hora_t'.
Christian Specht
1
@Oliver: la distinción entre mayúsculas y minúsculas no es por conexión. Es como una opción de servidor de base de datos / sql.
Nicholas Carey

Respuestas:

65

Sospecho que tienes dos mesas con el mismo nombre. Uno es propiedad del esquema 'dbo' ( dbo.PerfDiag) y el otro es propiedad del esquema predeterminado de la cuenta utilizada para conectarse a SQL Server (algo así como userid.PerfDiag).

Cuando tiene una referencia no calificada a un objeto de esquema (como una tabla), una no calificada por el nombre del esquema, la referencia del objeto debe resolverse. La resolución de nombres se produce al buscar en la siguiente secuencia un objeto del tipo apropiado (tabla) con el nombre especificado. El nombre se resuelve en la primera coincidencia:

  • Bajo el esquema predeterminado del usuario.
  • Bajo el esquema 'dbo'.

La referencia no calificada está vinculada a la primera coincidencia en la secuencia anterior.

Como práctica general recomendada, siempre se deben calificar las referencias a objetos de esquema, por razones de rendimiento:

  • Una referencia no calificada puede invalidar un plan de ejecución almacenado en caché para el procedimiento almacenado o la consulta, ya que el esquema al que estaba vinculada la referencia puede cambiar dependiendo de las credenciales que ejecutan el procedimiento almacenado o la consulta. Esto da como resultado la recompilación de la consulta / procedimiento almacenado, un impacto de rendimiento. Las recompilaciones hacen que se eliminen los bloqueos de compilación, lo que impide que otros accedan a los recursos necesarios.

  • La resolución de nombres ralentiza la ejecución de la consulta ya que se deben realizar dos sondeos para resolver la versión probable del objeto (la propiedad de 'dbo'). Este es el caso habitual. La única vez que una sola sonda resolverá el nombre es si el usuario actual posee un objeto del nombre y tipo especificados.

[Editado para ampliar la nota]

Las otras posibilidades son (sin ningún orden en particular):

  • No está conectado a la base de datos que cree que está.
  • No está conectado a la instancia de SQL Server que cree que está.

Verifique sus cadenas de conexión y asegúrese de que especifiquen explícitamente el nombre de la instancia de SQL Server y el nombre de la base de datos.

Nicolás Carey
fuente
4
+1 Utilizo el generador de perfiles sql para rastrear este tipo de problemas. Cada vez que trabaje con sql dinámico desde otras aplicaciones, capture la consulta con un seguimiento, cópiela y péguela en una nueva ventana de consulta, haga clic en ejecutar para averiguar qué está mal. Esto también validará que se está conectando a la instancia y la base de datos correctas como se sugirió anteriormente.
Brian
2
... un poco fuera del tema, pero si está usando el generador de perfiles para reproducir problemas de rendimiento, recuerde incluir todas las opciones establecidas , particularmente ARITHABORT para duplicar realmente la consulta (y su plan almacenado en caché)
Nick.McDermaid
Primero intente con Ctrl + Shift + R, para recargar la caché. En el peor de los casos, solo perderá unos segundos.
radbyx
267

Simplemente presione Ctrl+ Shift+ Ry vea ...

En SQL Server Management Studio, Ctrl + Shift + R actualiza la caché local.

Mangesh
fuente
¿Por qué cree que sería útil hacer eso?
Amistoso
7
En SQL Server Management Studio, Ctrl + Shift + R actualiza la caché de Intellisense. Esto impidió que Management Studio se quejara de que las columnas que había agregado no eran válidas, pero creo que fue una pista falsa (todavía tengo un problema, como el póster original, al acceder a estas nuevas columnas desde el código).
Giles
2
Parece que cada vez que agrego una migración, luego actualizo la base de datos, tengo que hacer esto. De lo contrario, entiendo que es un nombre de columna no válido en MS SQL Server. ¡Trabajos! Muchas gracias
BriOnH
1
Parece que tendrá que hacer esto cada vez que cree una tabla o algo por el estilo.
Sonny Childs
1
Esto de arriba es normalmente mi solución cuando ocurren cosas raras. En este caso, sin embargo, no resolvió el problema. Sin embargo, reiniciar SQL Studio hizo el truco.
Dan Mehlqvist
9

Si está ejecutando esto dentro de una transacción y una declaración SQL antes de que esto elimine / altere la tabla, también puede recibir este mensaje.

Stagg
fuente
1
+1. Modifiqué una tabla agregando una nueva columna y recibí este error en la siguiente declaración que hacía referencia a la nueva columna. Superé esto ejecutando las declaraciones hasta la alteración de la tabla de una vez y luego el resto en otra. No es la mejor de las soluciones, pero me desbloqueó. :)
Prasad Korhale
3

Finalmente apagué y reinicié Microsoft SQL Server Management Studio; y eso me lo arregló. Pero en otras ocasiones, bastaba con iniciar una nueva ventana de consulta.

IAM_AL_X
fuente
2

Si está utilizando variables con el mismo nombre que su columna, es posible que haya olvidado el marcador de variable '@'. En una instrucción INSERT, se detectará como una columna.

Dévan Coetzee
fuente
2

Simplemente tuve exactamente el mismo problema. Cambié el nombre de algunas columnas con alias en una tabla temporal que luego es utilizada por otra parte del mismo código. Por alguna razón, SQL Server Management Studio no capturó esto y se quejó de nombres de columna no válidos.

Lo que simplemente hice fue crear una nueva consulta, copiar y pegar el código SQL de la consulta anterior a esta nueva consulta y ejecutarla nuevamente. Esto pareció refrescar el ambiente correctamente.

Pie de manzana
fuente
1

En mi caso, reinicio Microsoft SQL Sever Management Studio y esto funciona bien para mí.

Rexhi
fuente
0

En mi caso, estaba tratando de obtener el valor de un ResultSet incorrecto al consultar múltiples declaraciones SQL.

Deepak Kataria
fuente
0

En mi caso, parece que el problema fue un extraño problema de almacenamiento en caché. Las soluciones anteriores no funcionaron.

Si su código funcionaba bien y agregó una columna a una de sus tablas y le da el error 'nombre de columna no válido', y las soluciones anteriores no funcionan, intente esto: Primero ejecute solo la sección de código para crear esa modificación table y luego ejecute todo el código.

LoMaPh
fuente
0

Incluyendo esta respuesta porque este fue el resultado principal para "sql de nombre de columna no válido" en Google y no vi esta respuesta aquí. En mi caso, obtenía un nombre de columna no válido, Id1 porque había usado la identificación incorrecta en mi declaración .HasForeignKey en mi código de Entity Framework C #. Una vez que lo cambié para que coincida con la identificación del objeto .HasOne (), el error desapareció.

Daniel
fuente
0

Recibí este error al ejecutar una función escalar usando un valor de tabla, pero a la instrucción Select en mi cláusula RETURN de función escalar le faltaba la parte "FROM table". : palmas faciales:

cdabel
fuente
0

También sucede cuando olvida cambiar ConnectionString y pregunta a una tabla que no tiene idea de los cambios que está realizando localmente.

Иво Недев
fuente