Подтвердить что ты не робот

Почему SQL Server 2000 обрабатывает тест SELECT. * И SELECT 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 без проблем запускал запрос?

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

Я нашел ссылку на него как на ошибку

Примечание: в результате сравнения ошибка алгоритма в 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. Такая же ссылкa > Изменения, внесенные в SQL Server 2005

  1. Исправлена ​​ошибка сравнения с привязкой к Dot.

Ответ 5

Является ли это в представлении "Открыть таблицу" SSMS или через Enterprise Manager или через окно запросов SSMS?

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

Ответ 6

Это ошибка.

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

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