Почему SQL Server 2000 обрабатывает тест SELECT. * И SELECT t.est. * Одинаково? - PullRequest
22 голосов
/ 04 июня 2010

Я обработал запрос в SQL Server 2000 и добавил точку в середине имени таблицы:

SELECT t.est.* FROM test

Вместо:

SELECT test.* FROM test

И запрос по-прежнему отлично выполняется . Даже SELECT t.e.st.* FROM test выполняется без проблем.

Я пробовал тот же запрос в SQL Server 2008, где запрос не выполняется (ошибка: префикс столбца не совпадает с именем таблицы или псевдонимом, используемым в запросе). Из соображений чистого любопытства я пытался выяснить, как SQL Server 2000 обрабатывает имена таблиц таким образом, чтобы можно было выполнить запрос с переворотом, но пока мне не очень повезло.

Любой гуру SQL знает, почему SQL Server 2000 выполнил запрос без проблем?

Обновление : Похоже, что запрос работает независимо от используемого интерфейса (например, Enterprise Manager, SSMS, OSQL) и, как указано ниже Jhonny , причудливо работает даже при попытке:

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

Ответы [ 6 ]

4 голосов
/ 04 июня 2010

Может быть, имена таблиц составлены из наивного соединения префикса и базового имени.

't' + 'est' == 'test'

И, возможно, в более поздних версиях SQL Server различие было сделано более семантическим / более строгим.

{ owner = t, table = est } != { table = test }
4 голосов
/ 04 июня 2010

SQL Server 2005 и выше имеет "правильную" реализацию схем. SQL 2000 и более ранних версий нет. Подробности меня избегают (прошло уже много лет с тех пор, как я использовал SQL 2000), все, что я ясно помню, это то, что вы не могли бы создать что-то, что не принадлежало dbo. Все это связано с пользователями и владением объектами, но модель 2000 года и более ранняя была довольно запутанной. Надеюсь, кто-нибудь прочтет BOL, проведет некоторые эксперименты и опубликует свои результаты здесь.

3 голосов
/ 08 июня 2010

Справочное руководство по S-SQL :

"[точка] Может использоваться для объединения нескольких имен в имя формы AB для ссылки на столбец в таблицеили таблица в схеме. Обратите внимание, что вы также просто используете символ с точкой в ​​нем. "

Так что я думаю, что если вы ссылаетесь на tblTest как tblT.est, он будет работать нормально до тех пор, покав tblTest нет столбца с именем 'est'.

Если он не может найти имя столбца, на которое указывает точка, я думаю, что он проверяет родителя объекта.

2 голосов
/ 15 июня 2010

Я обнаружил, что это ошибка

Примечание: в результате сравнения ошибка алгоритма в SQL Server 2000, точка Сами символы не влияют на соответствие, поэтому "dbo.t" будет успешно совпадать с таблицами "dbot", "d.b.o.t", и т.д.

из 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

Это исправлено в SQL Server 2005. Та же ссылка> Изменения, внесенные в SQL Server 2005

  1. Исправлена ​​ошибка сравнения с точками.
1 голос
/ 15 июня 2010

Это ошибка.

Это связано с внутренним представлением имен столбцов в SQL Server 2000, которые просочились .

Вы также не сможете создать столбец таблицы с именем, совпадающим с конкатенацией таблицы + столбца с другим столбцом, например, если у вас есть таблицы User и UserDetail, вы не сможете иметь в них столбцы DetailAge и Age. таблицы соответственно.

1 голос
/ 04 июня 2010

Это в представлении «Открыть таблицу» SSMS или через Enterprise Manager или через окно запросов SSMS?

Существует / была проблема SQL Server 2005 с SSMS , поэтому способ выполнения запроса влияет на его поведение.

...