SQL Server segnala "Nome colonna non valido", ma la colonna è presente e la query funziona tramite Management Studio


107

Sono entrato in un vicolo cieco. Ho una query generata da un C#codice. La query funziona Microsoft SQL Server Management Studiocorrettamente quando viene eseguita sullo stesso database.

Tuttavia, quando il mio codice tenta di eseguire la stessa query, ottengo lo stesso errore su una colonna non valida e viene generata un'eccezione. Tutte le query che fanno riferimento a questa colonna hanno esito negativo.

La colonna in questione è stata recentemente aggiunta al database. È una colonna della data chiamata Incident_Begin_Time_ts.

Un esempio che fallisce è:

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

Altre query come Select MAX(Incident_Being_Time_ts);anche falliscono quando vengono eseguite nel codice perché pensa che la colonna sia mancante.

Qualche idea?


Forse è un problema con la custodia? Forse Management Studio non si preoccupa del caso, mentre altri modi di accedere al database sono più rigidi.
Oliver

1
Sei sicuro di avere a che fare con lo stesso database nel tuo codice di quello in Management Studio?
rlb.usa

3
Sei sicuro che il nome della colonna che hai creato in C # e il nome della colonna che cerchi di interrogare siano esattamente gli stessi? Nella tua domanda scrivi due volte "Incident _ Begin _ Time_ts" e una volta "Incident _ Being _ Time_ts".
Christian Specht

1
@Oliver: la distinzione tra maiuscole e minuscole non è per connessione. È un'opzione per database / sql server.
Nicholas Carey

Risposte:


65

Ho il sospetto che tu abbia due tavoli con lo stesso nome. Uno è di proprietà dello schema "dbo" ( dbo.PerfDiag) e l'altro è di proprietà dello schema predefinito dell'account utilizzato per connettersi a SQL Server (qualcosa di simile userid.PerfDiag).

Quando si dispone di un riferimento non qualificato a un oggetto dello schema (come una tabella), non qualificato dal nome dello schema, il riferimento all'oggetto deve essere risolto. La risoluzione del nome avviene cercando nella sequenza seguente un oggetto del tipo appropriato (tabella) con il nome specificato. Il nome si risolve nella prima corrispondenza:

  • Sotto lo schema predefinito dell'utente.
  • Sotto lo schema "dbo".

Il riferimento non qualificato è associato alla prima corrispondenza nella sequenza precedente.

Come pratica generale consigliata, si dovrebbero sempre qualificare i riferimenti agli oggetti dello schema, per motivi di prestazioni:

  • Un riferimento non qualificato può invalidare un piano di esecuzione memorizzato nella cache per la stored procedure o la query, poiché lo schema a cui è stato associato il riferimento può cambiare a seconda delle credenziali che eseguono la stored procedure o la query. Ciò si traduce nella ricompilazione della query / stored procedure, un calo delle prestazioni. Le ricompilazioni causano la rimozione dei blocchi di compilazione, impedendo ad altri di accedere alle risorse necessarie.

  • La risoluzione dei nomi rallenta l'esecuzione delle query poiché è necessario eseguire due sonde per risolvere la probabile versione dell'oggetto (quella di proprietà di "dbo"). Questo è il solito caso. L'unica volta che un singolo probe risolverà il nome è se l'utente corrente possiede un oggetto del nome e del tipo specificati.

[Modificato in ulteriore nota]

Le altre possibilità sono (in nessun ordine particolare):

  • Non sei connesso al database che pensi di essere.
  • Non sei connesso all'istanza di SQL Server che pensi di essere.

Controlla le tue stringhe di connessione e assicurati che specifichino esplicitamente il nome dell'istanza di SQL Server e il nome del database.


4
+1 Uso sql profiler per tenere traccia di questi tipi di problemi. Ogni volta che gestisci sql dinamico da altre applicazioni, acquisisci la query con una traccia, copiala e incollala in una nuova finestra della query, fai clic su Esegui per scoprire cosa non va. Ciò convaliderà anche la connessione all'istanza e al database corretti come suggerito sopra.
brian

2
... leggermente fuori tema ma se stai usando il profiler per riprodurre problemi di prestazioni, ricorda di includere tutte le opzioni impostate , in particolare ARITHABORT per duplicare veramente la query (ed è un piano memorizzato nella cache)
Nick.McDermaid

Per prima cosa prova con Ctrl + Maiusc + R, per ricaricare la cache. Nel peggiore dei casi perdi solo pochi secondi.
radbyx

267

Basta premere Ctrl+ Shift+ Re vedere ...

In SQL Server Management Studio, Ctrl + Maiusc + R aggiorna la cache locale.


Perché pensi che sarebbe utile?
Amichevole

7
In SQL Server Management Studio, Ctrl + Maiusc + R aggiorna la cache di Intellisense. Ciò ha impedito a Management Studio di lamentarsi del fatto che le colonne che avevo aggiunto non fossero valide, ma penso che fosse una falsa pista (ho ancora un problema, come il poster originale, quando accedo a queste nuove colonne dal codice).
Giles

2
Sembra che ogni volta che aggiungo la migrazione, quindi aggiorni il database, devo farlo. Altrimenti ottengo che si tratta di un nome di colonna non valido in MS SQL Server. Lavori! Grazie mille.
BRIONH

1
Sembra che tu debba farlo ogni volta che crei una tabella o qualcosa del genere.
Sonny Childs

1
Questo di cui sopra è normalmente la mia soluzione quando si verificano cose strane. In questo caso tuttavia non ha risolto il problema. Il riavvio di SQL Studio ha tuttavia funzionato.
Dan Mehlqvist

9

Se lo stai eseguendo all'interno di una transazione e un'istruzione SQL prima di rilasciare / alterare la tabella, puoi anche ricevere questo messaggio.


1
+1. Ho modificato una tabella aggiungendo una nuova colonna e stavo ottenendo questo errore nell'istruzione successiva che fa riferimento alla nuova colonna. Ho superato questo problema eseguendo le istruzioni fino all'alterazione della tabella in una volta e poi il resto in un'altra. Non la più grande delle soluzioni, ma mi ha sbloccato. :)
Prasad Korhale

3

Alla fine ho spento e riavviato Microsoft SQL Server Management Studio; e questo ha risolto il problema per me. Ma altre volte, era sufficiente avviare una nuova finestra di query.


2

Se stai utilizzando variabili con lo stesso nome della colonna, è possibile che tu abbia dimenticato l'indicatore di variabile "@". In un'istruzione INSERT verrà rilevato come una colonna.


2

Ho appena avuto lo stesso identico problema. Ho rinominato alcune colonne con alias in una tabella temporanea che viene ulteriormente utilizzata da un'altra parte dello stesso codice. Per qualche motivo, questo non è stato acquisito da SQL Server Management Studio e si è lamentato di nomi di colonna non validi.

Quello che ho semplicemente fatto è creare una nuova query, copiare e incollare il codice SQL dalla vecchia query a questa nuova query ed eseguirlo di nuovo. Questo sembrava aggiornare correttamente l'ambiente.


1

Nel mio caso riavvio Microsoft SQL Server Management Studio e questo funziona bene per me.


0

Nel mio caso stavo cercando di ottenere il valore da ResultSet errato durante l'interrogazione di più istruzioni SQL.


0

Nel mio caso sembra che il problema fosse uno strano problema di cache. Le soluzioni di cui sopra non hanno funzionato.

Se il tuo codice funzionava correttamente e hai aggiunto una colonna a una delle tue tabelle e viene visualizzato l'errore "nome colonna non valido" e le soluzioni precedenti non funzionano, prova questo: prima esegui solo la sezione di codice per la creazione di quella modificata table e quindi eseguire l'intero codice.


0

Compresa questa risposta perché questo era il risultato principale per "nome colonna non valido sql" su Google e non ho visto questa risposta qui. Nel mio caso, ottenevo un nome colonna non valido, Id1 perché avevo usato l'ID sbagliato nella mia istruzione .HasForeignKey nel mio codice Entity Framework C #. Dopo averlo modificato in modo che corrisponda all'ID dell'oggetto .HasOne (), l'errore è scomparso.


0

Ho ricevuto questo errore durante l'esecuzione di una funzione scalare utilizzando un valore di tabella, ma l'istruzione Select nella clausola RETURN della funzione scalare mancava la parte "FROM table". : facepalms:


0

Succede anche quando ti dimentichi di modificare ConnectionString e chiedi a una tabella che non ha idea delle modifiche che stai apportando localmente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.