SQL Server meldet 'Ungültiger Spaltenname', aber die Spalte ist vorhanden und die Abfrage funktioniert über Management Studio

106

Ich bin in eine Sackgasse geraten. Ich habe eine Abfrage, die von einem C#Code generiert wird . Die Abfrage funktioniert einwandfrei, Microsoft SQL Server Management Studiowenn sie für dieselbe Datenbank ausgeführt wird.

Wenn mein Code jedoch versucht, dieselbe Abfrage auszuführen, wird der gleiche Fehler bezüglich einer ungültigen Spalte angezeigt und eine Ausnahme ausgelöst. Alle Abfragen, die auf diese Spalte verweisen, schlagen fehl.

Die betreffende Spalte wurde kürzlich zur Datenbank hinzugefügt. Es ist eine Datumsspalte mit dem Namen Incident_Begin_Time_ts.

Ein fehlgeschlagenes Beispiel ist:

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

Andere Abfragen wie schlagen Select MAX(Incident_Being_Time_ts);ebenfalls fehl, wenn sie im Code ausgeführt werden, weil sie glauben, dass die Spalte fehlt.

Irgendwelche Ideen?

kidl33t
quelle
Ist es vielleicht ein Problem mit dem Fall? Möglicherweise kümmert sich Management Studio nicht um den Fall, während andere Möglichkeiten für den Zugriff auf die Datenbank strenger sind.
Oliver
1
Sind Sie sicher, dass Sie in Ihrem Code mit derselben Datenbank arbeiten wie in Management Studio?
rlb.usa
3
Sind Sie sicher, dass der Spaltenname, den Sie in C # erstellt haben, und der Spaltenname, den Sie abfragen möchten, genau identisch sind? In Ihrer Frage schreiben Sie zweimal "Incident _ Begin _ Time_ts" und einmal "Incident _ Being _ Time_ts".
Christian Specht
1
@Oliver: Groß- und Kleinschreibung wird nicht pro Verbindung berücksichtigt. Es ist als Datenbank- / SQL-Serveroption.
Nicholas Carey

Antworten:

65

Ich vermute, dass Sie zwei Tabellen mit demselben Namen haben. Eines gehört dem Schema 'dbo' ( dbo.PerfDiag), das andere dem Standardschema des Kontos, das für die Verbindung mit SQL Server verwendet wird (so etwas wie userid.PerfDiag).

Wenn Sie einen nicht qualifizierten Verweis auf ein Schemaobjekt (z. B. eine Tabelle) haben - einen, der nicht durch den Schemanamen qualifiziert ist - muss der Objektverweis aufgelöst werden. Die Namensauflösung erfolgt durch Suchen in der folgenden Reihenfolge nach einem Objekt des entsprechenden Typs (Tabelle) mit dem angegebenen Namen. Der Name wird in die erste Übereinstimmung aufgelöst:

  • Unter dem Standardschema des Benutzers.
  • Unter dem Schema 'dbo'.

Die nicht qualifizierte Referenz ist an die erste Übereinstimmung in der obigen Sequenz gebunden.

Als allgemeine empfohlene Vorgehensweise sollten aus Leistungsgründen immer Verweise auf Schemaobjekte qualifiziert werden:

  • Eine nicht qualifizierte Referenz kann einen zwischengespeicherten Ausführungsplan für die gespeicherte Prozedur oder Abfrage ungültig machen, da sich das Schema, an das die Referenz gebunden wurde, abhängig von den Anmeldeinformationen ändern kann, die die gespeicherte Prozedur oder Abfrage ausführen. Dies führt zu einer Neukompilierung der Abfrage / gespeicherten Prozedur, einem Leistungseinbruch. Durch Neukompilierungen werden Kompilierungssperren aufgehoben, sodass andere Benutzer nicht auf die erforderlichen Ressourcen zugreifen können.

  • Die Namensauflösung verlangsamt die Ausführung von Abfragen, da zwei Tests durchgeführt werden müssen, um die wahrscheinliche Version des Objekts (die von 'dbo' gehört) aufzulösen. Dies ist der übliche Fall. Ein einzelner Test löst den Namen nur auf, wenn der aktuelle Benutzer ein Objekt mit dem angegebenen Namen und Typ besitzt.

[Zur weiteren Bearbeitung bearbeitet]

Die anderen Möglichkeiten sind (in keiner bestimmten Reihenfolge):

  • Sie sind nicht mit der Datenbank verbunden, von der Sie glauben, dass Sie sie sind.
  • Sie sind nicht mit der SQL Server-Instanz verbunden, von der Sie glauben, dass Sie sie sind.

Überprüfen Sie Ihre Verbindungszeichenfolgen noch einmal und stellen Sie sicher, dass sie den SQL Server-Instanznamen und den Datenbanknamen explizit angeben.

Nicholas Carey
quelle
4
+1 Ich benutze SQL Profiler, um diese Art von Problemen aufzuspüren. Jedes Mal, wenn Sie mit dynamischem SQL aus anderen Anwendungen arbeiten, erfassen Sie die Abfrage mit einem Trace, kopieren Sie sie und fügen Sie sie in ein neues Abfragefenster ein. Klicken Sie auf Ausführen, um herauszufinden, was falsch ist. Dadurch wird auch überprüft, ob Sie wie oben vorgeschlagen eine Verbindung zur richtigen Instanz und Datenbank herstellen.
Brian
2
... etwas außerhalb des Themas, aber wenn Sie den Profiler verwenden, um Leistungsprobleme zu reproduzieren, denken Sie daran, alle festgelegten Optionen einzuschließen, insbesondere ARITHABORT, um die Abfrage (und den zwischengespeicherten Plan) wirklich zu duplizieren
Nick.McDermaid
Versuchen Sie zuerst mit Strg + Umschalt + R, den Cache neu zu laden. Im schlimmsten Fall verschwenden Sie nur wenige Sekunden.
Radbyx
267

Drücken Sie einfach Ctrl+ Shift+ Rund sehen Sie ...

In SQL Server Management Studio aktualisiert Strg + Umschalt + R den lokalen Cache.

Mangesh
quelle
Warum denkst du, wäre das hilfreich?
Freundlich
7
In SQL Server Management Studio aktualisiert Strg + Umschalt + R den Intellisense-Cache. Dies hat Management Studio daran gehindert, sich darüber zu beschweren, dass die von mir hinzugefügten Spalten ungültig sind, aber ich denke, das war ein roter Hering (ich habe immer noch ein Problem wie beim Originalposter, wenn ich über Code auf diese neuen Spalten zugreife).
Giles
2
Scheint jedes Mal, wenn ich Migration hinzufüge und dann Datenbank aktualisiere, ich dies tun muss. Andernfalls wird in MS SQL Server ein ungültiger Spaltenname angezeigt. Funktioniert! Vielen Dank.
BriOnH
1
Sieht so aus, als müssten Sie dies möglicherweise jedes Mal tun, wenn Sie eine Tabelle oder ähnliches erstellen.
Sonny Childs
1
Dies ist normalerweise meine Lösung, wenn seltsame Dinge auftreten. In diesem Fall wurde das Problem jedoch nicht gelöst. Ein Neustart von SQL Studio hat es jedoch geschafft.
Dan Mehlqvist
9

Wenn Sie dies in einer Transaktion und einer SQL-Anweisung ausführen, bevor die Tabelle gelöscht / geändert wird, können Sie auch diese Nachricht erhalten.

Stagg
quelle
1
+1. Ich habe eine Tabelle durch Hinzufügen einer neuen Spalte geändert und diesen Fehler in der nächsten Anweisung erhalten, die auf die neue Spalte verweist. Ich habe dies überwunden, indem ich die Anweisungen bis zur Tabellenänderung in einem Zug und dann den Rest in einem anderen ausgeführt habe. Nicht die beste Lösung, hat mich aber entsperrt. :)
Prasad Korhale
3

Ich habe schließlich Microsoft SQL Server Management Studio heruntergefahren und neu gestartet. und das hat es für mich behoben. Zu anderen Zeiten reichte es jedoch aus, nur ein neues Abfragefenster zu starten.

IAM_AL_X
quelle
2

Wenn Sie Variablen mit demselben Namen wie Ihre Spalte verwenden, haben Sie möglicherweise die Variablenmarkierung '@' vergessen. In einer INSERT-Anweisung wird sie als Spalte erkannt.

Dévan Coetzee
quelle
2

Hatte gerade genau das gleiche Problem. Ich habe einige Alias-Spalten in einer temporären Tabelle umbenannt, die von einem anderen Teil desselben Codes weiter verwendet wird. Aus irgendeinem Grund wurde dies nicht von SQL Server Management Studio erfasst und es wurden ungültige Spaltennamen beanstandet.

Ich habe einfach eine neue Abfrage erstellt, den SQL-Code aus der alten Abfrage in diese neue Abfrage kopiert und erneut ausgeführt. Dies schien die Umgebung korrekt aufzufrischen.

Apfelkuchen
quelle
1

In meinem Fall starte ich Microsoft SQL Sever Management Studio neu und dies funktioniert gut für mich.

Rexhi
quelle
0

In meinem Fall habe ich versucht, den Wert von false ResultSet abzurufen, wenn mehrere SQL-Anweisungen abgefragt wurden.

Deepak Kataria
quelle
0

In meinem Fall scheint das Problem ein seltsames Caching-Problem zu sein. Die oben genannten Lösungen haben nicht funktioniert.

Wenn Ihr Code einwandfrei funktioniert hat und Sie einer Ihrer Tabellen eine Spalte hinzugefügt haben und der Fehler "Ungültiger Spaltenname" angezeigt wird und die oben genannten Lösungen nicht funktionieren, versuchen Sie Folgendes: Führen Sie zunächst nur den Codeabschnitt zum Erstellen dieser Änderung aus Tabelle und führen Sie dann den gesamten Code aus.

LoMaPh
quelle
0

Einschließlich dieser Antwort, da dies das Top-Ergebnis für "ungültiger Spaltenname sql" bei Google war und ich diese Antwort hier nicht gesehen habe. In meinem Fall erhielt ich den ungültigen Spaltennamen Id1, weil ich in meiner .HasForeignKey-Anweisung in meinem Entity Framework C # -Code die falsche ID verwendet hatte. Nachdem ich es so geändert hatte, dass es mit der ID des .HasOne () -Objekts übereinstimmt, war der Fehler behoben.

Daniel
quelle
0

Ich habe diesen Fehler beim Ausführen einer Skalarfunktion mit einem Tabellenwert erhalten, aber in der Select-Anweisung in der RETURN-Klausel meiner Skalarfunktion fehlte der Abschnitt "FROM table". : Gesichtspalmen:

cdabel
quelle
0

Dies tritt auch auf, wenn Sie vergessen, den ConnectionString zu ändern, und eine Tabelle fragen, die keine Ahnung von den Änderungen hat, die Sie lokal vornehmen.

Иво Недев
quelle