我想知道是否有人可以解释联接中唯一标识sql服务器对象的概念。
在我的示例中,有2个模式和2个表(但名称相同)。我的假设是,即使两个模式之间的表名可能相同,但只要使用全限定名databasename.schemaname.objectname引用它们,SQL Server就应该能够区分出它们。但是,事实并非如此,解决方法是使用alias。
如果有人可以解释或指出为什么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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句