Diese einfache Abfrage löst den Fehler "Ambiguous column name TaskID" nur auf einem Datenbankserver aus. Das ist lächerlich. Wir haben dies mit der gleichen Datenbankstruktur auf verschiedenen Servern und verschiedenen Versionen von SQL Server (2005/2008) getestet, und nur der Server dieses bestimmten Clients gibt den Fehler aus. Ich bin eigentlich frustriert.
%Vor% Ja, ich weiß, dass ich Tasks.TaskID
in die order by
-Klausel setzen kann, aber aus bestimmten Gründen kann ich das nicht.
Sie erhalten den mehrdeutigen Spaltennamen Fehler, wenn Sie Ihre Abfrage auf SQL Server 2000 oder unter Kompatibilitätsgrad 80 oder weniger ausführen. Auf dem SQL-Server 2005/2008 mit Kompatibilitätsgrad 90 oder besser läuft Ihre Abfrage einwandfrei.
Aus der Anweisung by clause docs:
"In SQL Server 2005 werden qualifizierte Spaltennamen und Aliase in Spalten aufgelöst, die in der FROM-Klausel aufgelistet sind. Wenn order_by_expression nicht qualifiziert ist, muss der Wert unter allen in der SELECT-Anweisung aufgelisteten Spalten eindeutig sein."
Meine Momma sagte, qualifiziere immer JEDE Spalte in einer Abfrage mit einem Tabellennamen / Alias wie "immer alle Spaltennamen in INSERTs aufnehmen" und genau wie "nicht SELECT *" usw.
Abgesehen davon, dass es einfacher ist, weil es den Quellcode selbst dokumentiert, verhindern Sie diesen Fehler, wenn Sie Spalten hinzufügen / ändern.
Überprüfen Sie Ihre Kompatibilitätsebenen, es gibt Unterschiede zwischen ihnen und der Funktionsweise von ORDER BY!
Im Allgemeinen wird in der Kompatibilitätsstufe 90 und höher, der Standardstufe für SQL Server 2008, eine ORDER BY-Anweisung ohne eine Tabellenname / Alias-Anweisung den Fehler erzeugen.
ALTER DATABASE-Kompatibilitätsebene (Transact-SQL) siehe Abschnitt: Unterschiede zwischen Kompatibilitätsgrad 80 und Stufe 90
Einstellung der Kompatibilitätsstufe von 80
WENN die Spaltenreferenzen in gebunden werden die ORDER BY-Liste zu den Spalten definiert in der SELECT-Liste, Spalte Mehrdeutigkeiten werden ignoriert und Spalte Präfixe werden manchmal ignoriert. Dies kann dazu führen, dass die Ergebnismenge zurückkehrt eine unerwartete Bestellung.
Zum Beispiel eine ORDER BY-Klausel mit a einzelne zweiteilige Säule (.) das verwendet wird als Verweis auf eine Spalte in einem SELECT Liste wird akzeptiert, aber der Tabellenalias wird ignoriert. Folgendes berücksichtigen Abfrage.
SELECT c1 = -c1 VON t_table AS x ORDER BY x.c1
Bei der Ausführung lautet das Spaltenpräfix ignoriert in der ORDER BY. Die Art Operation tritt nicht auf der angegebene Quellspalte (x.c1) als erwartet; stattdessen tritt es auf dem abgeleitete Spalte c1, die in definiert ist die Abfrage. Der Ausführungsplan dafür Abfrage zeigt, dass die Werte für die abgeleitete Spalte werden zuerst berechnet und dann werden die berechneten Werte sortiert.
Einstellung der Kompatibilitätsstufe von 90
Bei Spaltenmehrdeutigkeiten treten Fehler auf. Spaltenpräfixe, sofern vorhanden, in ORDER BY werden beim Binden nicht ignoriert zu einer Spalte, die in der SELECT-Liste definiert ist.
Betrachten Sie die folgende Abfrage.
SELECT c1 = -c1 VON t_table AS x ORDER BY x.c1
Bei der Ausführung wird das Spaltenpräfix in der ORDER BY-Klausel wird nicht ignoriert. Die Art Die Operation tritt in der angegebenen Quelle auf Spalte (x.c1) wie erwartet. Die Hinrichtung Plan für diese Abfrage zeigt, dass die Sortierung Der Operator ordnet die von t_table zurückgegebenen Zeilen an und dann die Werte für die abgeleitete Spalte c1, die in der SELECT-Liste definiert sind, werden berechnet.
Was ist, wenn Sie mit Bezeichnern versuchen? Durch die Verwendung dieser Kennungen weiß SQL Server, in welcher Spalte sortiert werden soll. Ich habe es nie anders gemacht und hatte nie Probleme. Ich brauche nicht genau, warum sql diese Identifikatoren benötigt, es ist offensichtlich, dass er nicht weiß, wo er bei ambitionierten Spaltennamen bestellen soll. Versuchen Sie etwas wie:
%Vor%BEARBEITEN: Und warum kannst du nicht? SQL wirft einen Fehler?
Was meinst du damit, du kannst nicht? Es ist klar, dass sowohl Aufgaben als auch TaskHelpers eine Spalte namens TaskID hat. Sie müssen angeben, welcher Tabelle die Spalte in der Order By zugeordnet ist.
Tags und Links sql sql-server