2015-10-29 107 views
5

我在想如果有人能解釋在連接中唯一標識sql server對象的概念。SQL Server對象名稱

在我的例子也有2種模式和2個表(但具有相同的名稱)。我的假設是,即使表名可能在兩個模式之間相同,只要它們被全限定名databasename.schemaname.objectname引用,SQL服務器應該能夠找出差異。 但是,似乎並非如此,解決方法是使用別名

如果有人能解釋或指出一些關於的文獻,爲什麼sql server不能唯一標識這些

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支持船型多部分組成的標識符:

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因爲SQL Server使用的東西叫做exposed name

暴露名

其是多部分的表名的最後一部分(如果沒有 別名),或別名時本

返回到您的查詢已公開姓名Table_1Table_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 

,從中可以忽略任何一部分,只要有沒有歧義。因此,在您的示例中,您可以忽略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

「關聯命名」中的上述查詢生成的錯誤。好的,有趣的SQL錯誤消息。我認識的大多數人都把這些(你的t1,t2)稱爲「表別名」,它們確實是解決這個問題的方法。 –

+1

@PhilipKelley別名是正確的,但我指的是別名的目的,這是相關的公開名稱。 –

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

工作的呢?

+0

當你別名表時,你會得到什麼錯誤? – proka

相關問題