Я с пальцами масла запрос в 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
Возможно, имена таблиц строятся из наивной конкатенации префикса и базового имени.
't' + 'est' == 'test'
И, возможно, в более поздних версиях SQL Server это различие стало более семантичным/более строгим.
{ owner = t, table = est } != { table = test }
SQL Server 2005 и выше имеет «правильную» реализацию схем. SQL 2000 и более ранние версии этого не сделали. Детали ускользают от меня (прошло много лет с тех пор, как я использовал SQL 2000), все, что я четко помню, это то, что вы были бы сумасшедшими, создавая что-то, что не принадлежит «dbo». Все это связано с пользователями и владением объектами, но модель 2000 года и ранее была довольно запутанной. Надеюсь, кто-нибудь прочитает о BOL, поэкспериментирует и опубликует здесь свои результаты.
Справочное руководство по S-SQL:
"[dot] Может использоваться для объединения нескольких имен в имя вида A.B для ссылки на столбец в таблице или таблицу в схеме. Обратите внимание, что вы также можете просто использовать символ с точкой в нем."
Поэтому я думаю, что если вы ссылаетесь на tblTest как tblT.est, это будет работать нормально, пока в tblTest нет столбца с названием 'est'.
Если он не может найти имя столбца, на который ссылается точка, я думаю, он проверяет родителя объекта.
Находится ли он в представлении SSMS «Открытая таблица», или через Enterprise Manager, или через окно запроса SSMS?
Существует / была проблема SQL Server 2005 с SSMS , поэтому то, как вы выполняете запрос, влияет на то, как это ведет себя.
Это ошибка.
Это связано с внутренним представлением имен столбцов в SQL Server 2000, которое просочилось .
Вы также не сможете создать столбец таблицы с именем, которое конфликтует с объединением таблица + столбец с другим столбцом, например, если у вас есть таблицы User и UserDetail, вы не сможете иметь столбцы DetailAge и Age в них. таблицы соответственно.
Я нашел упоминание о том, что это ошибка
Примечание: в результате ошибки в алгоритме сравнения алгоритма сравнения в SQL Server 2000, точечные символы сами по себе не влияют на сопоставление, поэтому "dbo.t" будет успешно с таблицами "dbot", "d.b.o.t", и т.д.
Это исправлено в SQL Server 2005. Та же ссылка > Изменения, внесенные в SQL Server 2005
- Исправлена ошибка сравнения, связанная с точками.