2015-10-29 4 views
5

Мне интересно, может ли кто-нибудь объяснить концепцию однозначно идентифицирующих серверных объектов sql в соединении.Имена объектов SQL Server

В моем примере есть 2 схемы и 2 таблицы (но с тем же именем). Мое предположение заключалось в том, что хотя имя таблицы может быть одинаковым между 2-мя схемами, если на них ссылается их полное имя имя_базы_файла.schemaname.objectname, SQL-сервер должен иметь возможность разглядеть разницу. Однако, похоже, это не так, и обходным путем для этого является использование псевдонима.

Я был бы признателен, если кто-нибудь может объяснить или указать на какую-либо литературу около , почему сервер sql не может однозначно идентифицировать эти.

CREATE SCHEMA [Sch1] 
GO 

CREATE SCHEMA [Sch2] 
GO 

CREATE TABLE [Sch1].[Table_1](
    [ID] [int] NULL, 
    [DESC] [nchar](10) NULL 
) ON [PRIMARY] 
GO 

CREATE TABLE [Sch2].[Table_1](
    [ID] [int] NULL, 
    [DESC] [nchar](10) NULL 
) ON [PRIMARY] 
GO 


Select * 
From Sch1.Table_1 
Join Sch2.Table_1 
    on Sch1.Table_1.Id = Sch2.Table_1.Id 
+0

Какую ошибку вы получаете? – lad2025

+0

Объекты «DBA_2014.Sch2.Table_1» и «DBA_2014.Sch1.Table_1» в предложении FROM имеют одинаковые открытые имена. Используйте имена корреляции, чтобы отличить их. – user2811633

+0

Можете ли вы попробовать свой код с SQL Server 2000 или уровнем совместимости 80? – lad2025

ответ

3

SQL Server поддерживает Muliti-часть идентификаторов:

linked_server.db_name.schema.table_name 

В вашем случае у вас есть:

Select * 
From Sch1.Table_1 
Join Sch2.Table_1 
    on Sch1.Table_1.Id = Sch2.Table_1.Id 

Теперь вы удивляетесь, почему SQL Server не может различать между ними:

Sch1.Table_1 != Sch2.Table_1 

c ase из-за SQL Server использовать что-то под названием exposed name.

подвергается Название

который является последней частью несколько частей имени таблицы (если нет псевдонима) или имя псевдонима, когда присутствует

Возвращаясь к в вашем запросе вы обнаружили имена Table_1 и Table_1, которые являются дубликатами, и вам нужно использовать псевдонимы.

От SQL Server 2005+:

алгоритм обнаружения таблицы Дубликат был изменен соответственно, так, что все таблицы с одинаковыми открытыми именами будут считаться дублирует

Я подозреваю, что ваш код может работать с SQL Server 2000, но я не могу проверить это точно.

Для получения дополнительной информации читайте Msg 1013

+1

Спасибо за указание на исходное сообщение. Некоторые дополнительные исследования и детали на этом посту помогли мне понять это немного больше. – user2811633

1

Насколько я могу судить, я не вижу ошибок в вашем примере кода. Пожалуйста, подробно объясните, с какими ошибками вы сталкиваетесь.

Что касается соглашения об именовании четырех частей. Синтаксис полное имя объекта:

server.database.schema.object 

Так полное использование было бы, например:

select * from servername.databasename.Sch1.Table_1 

или

select * from servername.databasename.Sch2.Table_2 

, из которого вы можете игнорировать любую часть до тех пор, пока не является двусмысленностью. Поэтому в вашем примере вы можете игнорировать имя_имя и имя_базы, так как они одинаковы. Но вы не можете игнорировать имена схем, как нет.

Добавление:

На основании сообщения об ошибке Написал позже, вы должны использовать корреляцию именования на синтаксисе присоединиться:

select * 
from Sch1.Table_1 as t1 
inner join Sch2.Table_1 as t2 on t1.ID=t2.ID 
+0

Я добавил ошибку, которую SQL Server производит для указанного выше запроса в комментарии – user2811633

+0

«Именование корреляции». Хорошо, интересное сообщение об ошибке SQL. Большинство из тех, кого я знаю, просто ссылаются на эти (ваши t1, t2) как «псевдонимы таблицы», и они действительно являются причиной этой проблемы. –

+1

@PhilipKelley alias прав, но я имею в виду цель псевдонима здесь, которая коррелирует открытые имена. –

0
Select * 
    From Sch1.Table_1 x 
    Join Sch2.Table_1 y 
     on x.Id = y.Id 

делает эту работу?

+0

Какие ошибки вы получаете, когда вы используете псевдоним таблицы? – proka

 Смежные вопросы

  • Нет связанных вопросов^_^