Я уверен, что это должно быть задокументировано ГДЕ-ТО, но на всю жизнь я просто не могу найти какую-либо документацию, объясняющую поведение.
Принимая 4 способа ссылки на таблицы (я неНе верьте, что есть еще, но не стесняйтесь исправлять меня):
- Текущая база данных
- Удаленная база данных
- Связанный сервер
- Синоним
Их поведение при использовании многоэлементных идентификаторов столбцов, кажется, отличается, и я пытаюсь понять причины этого. Я проверил различные типы операторов SELECT
:
Текущая база данных
Работы
SELECT Column FROM Schema.Table;
SELECT Table.Column FROM Schema.Table;
SELECT Schema.Table.Column FROM Schema.Table;
SELECT Alias.Column FROM Schema.Table AS Alias;
Даже это работает! (Очевидно, только при использовании схемы dbo, но все же)
SELECT Schema.Table.Column FROM Table;
Удаленная база данных
Работает
SELECT Column FROM RemoteDB.Schema.Table;
SELECT Table.Column FROM RemoteDB.Schema.Table;
SELECT RemoteDB.Schema.Table.Column FROM RemoteDB.Schema.Table;
SELECT Alias.Column FROM RemoteDB.Schema.Table AS Alias;
Сбой
SELECT Schema.Table.Column FROM RemoteDB.Schema.Table;
The multi-part identifier "Schema.Table.Column" could not be bound.
Связанный сервер
Работает
SELECT Column FROM LinkedServer.RemoteDB.Schema.Table;
SELECT Table.Column FROM LinkedServer.RemoteDB.Schema.Table;
SELECT Alias.Column FROM LinkedServer.RemoteDB.Schema.Table AS Alias;
Fails
SELECT Schema.Table.Column FROM LinkedServer.RemoteDB.Schema.Table;
The multi-part identifier "Schema.Table.Column" could not be bound.
SELECT RemoteDB.Schema.Table.Column FROM LinkedServer.RemoteDB.Schema.Table;
The multi-part identifier "RemoteDB.Schema.Table.Column" could not be bound.
SELECT LinkedServer.RemoteDB.Schema.Table.Column FROM LinkedServer.RemoteDB.Schema.Table;
The multi-part identifier "LinkedServer.RemoteDB.Schema.Table.Column" could not be bound.
**I believe this fails are you're only allowed a maximum of 4 parts in the identifier?**
**Read this somewhere but nothing authoritive. Would appreciate a reference.**
Синоним
Работает
SELECT Column FROM SynonymName;
SELECT Column FROM SynonymSchema.SynonymName;
SELECT SynonymName.ColumnName FROM SynonymSchema.SynonymName;
SELECT SynonymSchema.SynonymName.Column FROM SynonymSchema.SynonymName;
SELECT Alias.Column FROM SynonymSchema.SynonymName AS Alias;
Даже это работает! (Очевидно, только при использовании схемы dbo, но все же)
SELECT SynonymSchema.SynonymName.Column FROM SynonymName;
- Я пытаюсь понять, почему определенные идентификаторы из нескольких частей работают, когда используются односторонне(например, схема для локального БД), но затем происходит сбой при использовании другого способа (например, схема для удаленного БД / связанного сервера).
- Следует ли вам всегда использовать псевдонимы, чтобы гарантировать, что все будет работать всегда?
Любой совет будет высоко оценен, особенно указательs к официальной документации относительно причины разработки и рекомендаций по оптимальной практике для сценария «один размер подходит всем» (который в настоящее время я собираюсь предположить, чтобы быть маршрутом псевдонима).