use*_*633 5 sql sql-server join objectname
我想知道是否有人可以解释在连接中唯一标识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
Run Code Online (Sandbox Code Playgroud)
支持SQL Server
多部分标识符:
linked_server.db_name.schema.table_name
Run Code Online (Sandbox Code Playgroud)
在你的情况下,你有:
Select *
From Sch1.Table_1
Join Sch2.Table_1
on Sch1.Table_1.Id = Sch2.Table_1.Id
Run Code Online (Sandbox Code Playgroud)
现在你想知道为什么SQL Server
不能区分它们:
Sch1.Table_1 != Sch2.Table_1
Run Code Online (Sandbox Code Playgroud)
这种情况是因为SQL Server
使用了一种叫做exposed name
.
暴露的名字
这是多部分表名称的最后一部分(如果没有别名),或别名(如果存在)
返回到您的查询,您已经公开了名称Table_1
,并且Table_1
这些名称是重复的,您需要使用别名。
从SQL Server 2005+
:
重复表检测算法已相应更改,因此任何具有相同公开名称的表都将被视为重复
我怀疑你的代码可以与 SQL Server 2000 一起工作,但我无法确定它。
欲了解更多信息,请阅读Msg 1013
归档时间: |
|
查看次数: |
626 次 |
最近记录: |