我想知道是否有人能解释在联接中唯一标识sql server对象的概念。
在我的示例中,有2个模式和2个表(但名称相同)。我的假设是,即使两个模式之间的表名可能相同,只要它们是用其完全限定名databasename.schemaname.objectname引用的,SQL server应该能够区分这两个模式然而,情况似乎并非如此,解决方法是使用别名。
如果有人能解释或向周围的一些文献指出为什么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
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
这种情况是因为SQL Server
使用了一种名为exposed name
的东西。
暴露名称
是多部分表名称的最后一部分(如果没有别名),或存在时的别名
返回到您的查询,您已经公开了名称Table_1
和Table_1
,它们是重复的,您需要使用别名。
来自SQL Server 2005+
:
重复表检测算法也发生了相应的变化,以便将考虑具有相同公开名称的任何表复制
我怀疑您的代码可以与SQL Server 2000一起使用,但我无法确定是否可以检查。
有关更多信息,请阅读Msg 1013
据我所知,我在您的示例代码中没有看到任何错误。请详细解释您遇到的错误。
至于由四部分组成的命名约定。完整的对象名称语法为:
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
Select *
From Sch1.Table_1 x
Join Sch2.Table_1 y
on x.Id = y.Id
这行得通吗?