Fehler "Mehrdeutiger Spaltenname" auf einem bestimmten Server

7

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.

    
Alex 07.05.2010, 12:02
quelle

6 Antworten

4

Wow. Das Problem lag im Datenbankkompatibilitätsmodus. Es wurde auf "80" (2000) eingestellt. Ich habe es auf 90 gesetzt und die Abfrage funktioniert jetzt gut.

Weitere Informationen zu den Kompatibilitätsebenen finden Sie hier: Ссылка

    
Alex 07.05.2010, 12:36
quelle
11

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."

    
Ray 07.05.2010 12:35
quelle
8

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.

    
KM. 07.05.2010 12:31
quelle
5

Sie können den Index der zu sortierenden Spalte angeben:

%Vor%     
Guffa 07.05.2010 12:04
quelle
1

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?

    
Rob 07.05.2010 12:07
quelle
0

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.

    
Randy Minder 07.05.2010 12:03
quelle

Tags und Links