SQL Server对象名称

问题描述:

我在想如果有人能解释在连接中唯一标识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

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

据我所知,我没有看到您的示例代码中的任何错误。请详细解释你遇到的错误。

至于四​​部分的命名约定。对象的全称语法是:

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别名是正确的,但我指的是别名的目的,这是相关的公开名称。 –

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

工作的呢?

+0

当你别名表时,你会得到什么错误? – proka