2010-06-04 5 views
22

ich eine Abfrage in SQL Server 2000 und hat eine Periode, in der Mitte des Tabellennamen Butter-Finger:Warum behandelt SQL Server 2000 SELECT test. * Und SELECT t.est. * Das gleiche?

SELECT t.est.* FROM test 

Statt:

SELECT test.* FROM test 

Und die Abfrage immer noch perfekt ausgeführt. Sogar SELECT t.e.st.* FROM test wird ohne Problem ausgeführt.

Ich habe die gleiche Abfrage in SQL Server 2008 versucht, wo die Abfrage fehlschlägt (Fehler: das Spaltenpräfix stimmt nicht mit einem Tabellennamen oder Alias ​​in der Abfrage verwendet). Aus Gründen der reinen Neugierde habe ich versucht herauszufinden, wie SQL Server 2000 die Tabellennamen so behandelt, dass die Butter-Finger-Abfrage ausgeführt werden kann, aber bisher hatte ich nicht viel Glück.

Alle SQL-Gurus wissen, warum SQL Server 2000 die Abfrage ohne Problem ausgeführt hat?

aktualisieren: Die Abfrage erscheint unabhängig von der Schnittstelle (zB Enterprise Manager, SSMS, OSQL) und als Jhonny wies darauf hin, darunter auch funktioniert bizarr verwendet zu arbeiten, wenn Sie versuchen:

SELECT TOP 1000 dbota.ble.* FROM dbo.table 
+0

Wenn Ich musste eine Vermutung wagen, weil SQL deine Anfrage als Vorschlag nimmt. Um sicherzustellen, dass die Ergebnisse auf die effizienteste Art und Weise zurückgegeben werden, wird Ihre Abfrage untersucht und geändert, damit sie besser funktioniert. In Ihrem Beispiel ist der Alias ​​unwichtig, da es eine * FROM-Tabelle ist ... Obwohl ich keine Möglichkeit habe, dies zu beweisen (also kommentieren und nicht antworten) Könnten Sie versuchen, einen Join zu machen, so dass Sie 2 Tabellen haben und es so testen? Wenn es eine Chance für Mehrdeutigkeit gibt, könnte es beginnen, sich mehr um sie zu kümmern. – Shaded

+0

Du hast mich jetzt auch neugierig gemacht! Ich habe keine Instanz SQL Server 2000 zur Hand bei der MO, aber bin fasziniert ... – AdaTheDev

+0

@Shaded, Ich habe gelernt, Sie haben vielleicht auf die Lösung getroffen, aber es scheint, dass es funktioniert, auch wenn mehrere Tabellen in der Abfrage vorhanden sind . Diese Abfrage funktioniert auch ohne Probleme: 'SELECT t.est. *, T.est2. * FROM test, test2'. Ich habe auch versucht, ein paar Tische zu verbinden, um sicherzugehen, und das lief auch gut. –

Antwort

4

Vielleicht sind Tabellennamen aus einer naiven Verkettung von Präfix und Basisname aufgebaut.

Und vielleicht in den späteren Versionen von SQL Server wurde die Unterscheidung semantischer/rigoroser gemacht.

{ owner = t, table = est } != { table = test } 
+0

Ich vermute, dass Sie auf die Antwort gekommen sind. Wenn wir irgendwelche unterstützenden MS-Dokumente finden können, denke ich, dass wir den Fall damit abschließen können. –

4

SQL Server Ab 2005 gibt es eine "richtige" Implementierung von Schemas. SQL 2000 und früher nicht. Die Details entziehen sich mir (es ist Jahre her, dass ich SQL 2000 benutzt habe), alles was ich mich erinnere ist eindeutig, dass du verrückt sein würdest, etwas zu erschaffen, das nicht "dbo" gehörte. Alles hängt mit den Benutzern und dem Objektbesitz zusammen, aber das Modell von 2000 und früher war ziemlich konfus. Hoffentlich wird jemand BOL lesen, etwas experimentieren und ihre Ergebnisse hier veröffentlichen.

+1

" ... du wärst verrückt ... "ist eindeutig nur meine persönliche Meinung, wie durch die vielen Jahre getrübt. –

+0

+1. Zweifellos ist es eine Meinung von vielen anderen, mich eingeschlossen. – NotMe

1

Ist es in der "Open table" Ansicht von SSMS oder über Enterprise Manager oder über ein SSMS Query Window?

There is/was a SQL Server 2005 issue with SSMS so, wie Sie die Abfrage ausführen beeinflusst, wie es sich verhält.

+1

Es scheint funktionieren unabhängig davon, welche Schnittstelle ich verwende. Bisher habe ich OSQL, Enterprise Manager und SSMS 2008 Query Window getestet. –

3

S-SQL reference manual:

"[dot] Can be used to combine multiple names into a name of the form A.B to refer to a column in a table, or a table in a schema. Note that you calso just use a symbol with a dot in it."

Ich denke also, wenn Sie tblTest als tblT.est verwiesen wäre es OK arbeiten, solange es nicht eine Spalte 'est' in tblTest genannt.

Wenn es keinen Spaltennamen finden kann, der mit dem Punkt referenziert wird, stelle ich mir vor, dass er das Elternobjekt überprüft.

1

Dies ist ein Fehler.

Es hat mit der internen Darstellung von Spaltennamen in SQL Server 2000 zu tun, dass leaked out.

Sie können auch keine Tabellenspalte mit einem Namen erstellen, der mit Tabellen- und Spaltenverkettung mit einer anderen Spalte kollidiert. Wenn Sie beispielsweise Tabellen User und UserDetail haben, können Sie die Spalten DetailAge und Age nicht haben diese Tabellen jeweils.

2

fand ich es eine Referenz

Note: as a result of a comparison algorithm bug in SQL Server 2000, dot symbols themselves have no effect on matching, so "dbo.t" will successfully match with tables "dbot", "d.b.o.t", etc

von http://blogs.msdn.com/b/ialonso/archive/2007/12/21/msg-1013-the-object-s-and-s-in-the-from-clause-have-the-same-exposed-names-use-correlation-names-to-distinguish-them.aspx

Es in SQL Server festgelegt ist schon 2005 Gleiche Link ein Bug zu sein> in SQL Server eingeführt Änderungen 2005

  1. Dot-related comparison bug has been fixed.