SQL 服务器对象名称
SQL Server Object Names
我想知道是否有人可以解释在连接中唯一标识 sql 服务器对象的概念。
在我的示例中,有 2 个模式和 2 个 table(但名称相同)。我的假设是,即使 table 名称在 2 个模式之间可能相同,只要它们使用其完整限定名称 databasename.schemaname.objectname 引用,SQL 服务器应该能够区分. 然而,情况似乎并非如此,解决方法是使用别名。
如果有人可以解释或指出一些关于 为什么 sql 服务器不能唯一标识这些 .
的文献,我将不胜感激
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
据我所知,我在您的示例代码中没有发现任何错误。请详细说明您遇到的错误。
至于四部分命名约定。完整的对象名称语法是:
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
Select *
From Sch1.Table_1 x
Join Sch2.Table_1 y
on x.Id = y.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
.
的东西
exposed name
which is the last part of the multi-part table name (if there is no
alias), or alias name when present
返回到您的查询,您已经公开了重复的名称 Table_1
和 Table_1
,您需要使用别名。
来自SQL Server 2005+
:
Duplicate table detection algorithm has been changed correspondingly,
so that any tables with the same exposed names will be considered
duplicates
我怀疑您的代码可以与 SQL Server 2000 一起使用,但我无法确定。
有关详细信息,请阅读 Msg 1013
我想知道是否有人可以解释在连接中唯一标识 sql 服务器对象的概念。
在我的示例中,有 2 个模式和 2 个 table(但名称相同)。我的假设是,即使 table 名称在 2 个模式之间可能相同,只要它们使用其完整限定名称 databasename.schemaname.objectname 引用,SQL 服务器应该能够区分. 然而,情况似乎并非如此,解决方法是使用别名。
如果有人可以解释或指出一些关于 为什么 sql 服务器不能唯一标识这些 .
的文献,我将不胜感激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
据我所知,我在您的示例代码中没有发现任何错误。请详细说明您遇到的错误。
至于四部分命名约定。完整的对象名称语法是:
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
Select *
From Sch1.Table_1 x
Join Sch2.Table_1 y
on x.Id = y.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
.
exposed name
which is the last part of the multi-part table name (if there is no alias), or alias name when present
返回到您的查询,您已经公开了重复的名称 Table_1
和 Table_1
,您需要使用别名。
来自SQL Server 2005+
:
Duplicate table detection algorithm has been changed correspondingly, so that any tables with the same exposed names will be considered duplicates
我怀疑您的代码可以与 SQL Server 2000 一起使用,但我无法确定。
有关详细信息,请阅读 Msg 1013