5

我想知道是否有人可以解释在连接中唯一标识 sql server 对象的概念。

在我的示例中,有 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
4

3 回答 3

3

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_1Table_1哪些是重复的,您需要使用别名。

来自SQL Server 2005+

重复表检测算法已相应更改,因此任何具有相同暴露名称的表都将被视为重复表

我怀疑您的代码可以与 SQL Server 2000 一起使用,但我无法确定。

欲了解更多信息,请阅读Msg 1013

于 2015-10-29T22:13:38.760 回答
1

据我所知,我在您的示例代码中看不到任何错误。请详细说明您遇到的错误。

至于四部分命名约定。完整的对象名称语法是:

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
于 2015-10-29T21:47:45.817 回答
0
   Select *
    From Sch1.Table_1 x
    Join Sch2.Table_1 y
        on x.Id = y.Id

这行得通吗?

于 2015-10-29T21:50:09.023 回答