SQL Server对象名称
我在想如果有人能解释在连接中唯一标识sql server对象的概念。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
的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
c因为SQL Server
使用的东西叫做exposed name
。
暴露名
其是多部分的表名的最后一部分(如果没有 别名),或别名时本
返回到您的查询已公开姓名Table_1
和Table_1
,它们是重复的,您需要使用别名。
从SQL Server 2005+
:
重复表格检测算法进行了相应的变化, 使具有相同暴露名称的表格将被视为 复制
我怀疑你的代码可以使用SQL Server 2000,但我无法确定。
欲了解更多信息阅读Msg 1013
感谢您指向原始帖子。在这篇文章中的一些额外的研究和细节帮助我理解这一点。 – user2811633
据我所知,我没有看到您的示例代码中的任何错误。请详细解释你遇到的错误。
至于四部分的命名约定。对象的全称语法是:
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
我添加了错误SQL服务器为注释 – user2811633
“关联命名”中的上述查询生成的错误。好的,有趣的SQL错误消息。我认识的大多数人都把这些(你的t1,t2)称为“表别名”,它们确实是解决这个问题的方法。 –
@PhilipKelley别名是正确的,但我指的是别名的目的,这是相关的公开名称。 –
你得到什么错误? – lad2025
FROM子句中的对象“DBA_2014.Sch2.Table_1”和“DBA_2014.Sch1.Table_1”具有相同的公开名称。使用相关名称来区分它们。 – user2811633
你能用SQL Server 2000或兼容级别80来试试你的代码吗? – lad2025