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 Studio
wenn 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?
quelle
Antworten:
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 wieuserid.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:
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):
Überprüfen Sie Ihre Verbindungszeichenfolgen noch einmal und stellen Sie sicher, dass sie den SQL Server-Instanznamen und den Datenbanknamen explizit angeben.
quelle
Drücken Sie einfach Ctrl+ Shift+ Rund sehen Sie ...
In SQL Server Management Studio aktualisiert Strg + Umschalt + R den lokalen Cache.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
In meinem Fall starte ich Microsoft SQL Sever Management Studio neu und dies funktioniert gut für mich.
quelle
In meinem Fall habe ich versucht, den Wert von false ResultSet abzurufen, wenn mehrere SQL-Anweisungen abgefragt wurden.
quelle
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.
quelle
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.
quelle
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:
quelle
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