Почему SQL Server 2000 рассматривает ИЗБРАННЫЙ тест.* и ВЫБОР t.est.* то же?

Я с пальцами масла запрос в 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 выполнил запрос без проблемы?

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

SELECT TOP 1000 dbota.ble.* FROM dbo.table
22
задан Community 23 May 2017 в 11:45
поделиться

6 ответов

Возможно, имена таблиц строятся из наивной конкатенации префикса и базового имени.

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

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

{ owner = t, table = est } != { table = test }
4
ответ дан 29 November 2019 в 05:48
поделиться

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

4
ответ дан 29 November 2019 в 05:48
поделиться

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

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

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

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

3
ответ дан 29 November 2019 в 05:48
поделиться

Находится ли он в представлении SSMS «Открытая таблица», или через Enterprise Manager, или через окно запроса SSMS?

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

1
ответ дан 29 November 2019 в 05:48
поделиться

Это ошибка.

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

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

1
ответ дан 29 November 2019 в 05:48
поделиться

Я нашел упоминание о том, что это ошибка

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

from 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. Исправлена ошибка сравнения, связанная с точками.
2
ответ дан 29 November 2019 в 05:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: