2015-10-29 18 views
5

私は、誰かが結合でSQL Serverオブジェクトを一意に識別するという概念を説明できるかどうか疑問に思っています。SQL Serverオブジェクト名

私の例では、2つのスキーマと2つのテーブルがありますが(名前は同じです)。私の前提は、テーブル名が2つのスキーマ間で同じであっても、完全修飾名databasename.schemaname.objectnameで参照されている限り、SQLサーバーは違いを明らかにできるはずです。 しかし、そうではないようですが、この回避策は別名を使用することです。

については、誰かが説明したり指摘したりすることができますが、なぜこのような場合は、SQLサーバでこれらのIDを一意に識別できないのでしょうか。ありがとうございます。

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

FROM句のオブジェクト "DBA_2014.Sch2.Table_1"と "DBA_2014.Sch1.Table_1"の公開名は同じです。相関名を使用してそれらを区別します。 – 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_1Table_1という名前が公開されており、エイリアスを使用する必要があります。 SQL Server 2005+から

:同じ公開名を持つ任意のテーブルが 考慮される よう

重複テーブル検出アルゴリズムは、相応に変更されている私はあなたのコードと思われる

を複製SQL Server 2000で動作する可能性がありますが、確認することはできません。詳細情報については

は、あなたが得るどのようなエラーMsg 1013

+1

元の投稿を指していただきありがとうございます。このポストのいくつかの追加の研究と詳細は、これをもう少し理解するのを助けました。 – user2811633

1

は、私の知る限り、私はあなたのサンプルコードにエラーが表示されません。発生したエラーを詳細に説明してください。

4部構成の命名規則です。完全なオブジェクト名の構文は次のとおりです。

server.database.schema.object 

だから、完全な使用は、例えば、次のようになります。あなたは限りがある任意の部分を無視することができ、そこから

select * from servername.databasename.Sch1.Table_1 

または

select * from servername.databasename.Sch2.Table_2 

あいまいさはありません。したがって、あなたの例ではsevernameとdatabasenameは同じであるので無視することができます。しかし、そうでないスキーマ名は無視できません。

補遺:あなたは後で投稿のエラーメッセージに基づいて

、あなたが結合構文上の命名相関を採用する必要があります。

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

上記のクエリのSQLサーバーが生成するエラーをコメント – user2811633

+0

の "Correlation Naming"に追加しました。 [OK]を、面白いSQLエラーメッセージ。私が知っているほとんどの人は、これら(あなたのt1、t2)を「テーブルエイリアス」と呼んでいます。 –

+1

@PhilipKelleyエイリアスは正しいですが、ここではエクスポーズされた名前を関連付けるエイリアスの目的を指しています。 –

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

は、この仕事をしていますか?

+0

テーブルのエイリアスにはどのようなエラーがありますか? – proka

関連する問題