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_1Table_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