【发布时间】:2019-10-29 11:09:59
【问题描述】:
我确信这必须在某处记录,但在我的一生中,我似乎无法找到任何解释该行为的实际文档。
采取4种方式来引用表格(我不相信还有更多但请随时纠正我):
- 当前数据库
- 远程数据库
- 链接服务器
- 同义词
他们在使用多部分列标识符时的行为似乎有所不同,我试图了解其背后的原因。我已经测试了各种类型的SELECT 语句:
当前数据库
作品
SELECT Column FROM Schema.Table;
SELECT Table.Column FROM Schema.Table;
SELECT Schema.Table.Column FROM Schema.Table;
SELECT Alias.Column FROM Schema.Table AS Alias;
即使这样也行! (显然仅在使用 dbo Schema 时,但仍然如此)
SELECT Schema.Table.Column FROM Table;
远程数据库
作品
SELECT Column FROM RemoteDB.Schema.Table;
SELECT Table.Column FROM RemoteDB.Schema.Table;
SELECT RemoteDB.Schema.Table.Column FROM RemoteDB.Schema.Table;
SELECT Alias.Column FROM RemoteDB.Schema.Table AS Alias;
失败
SELECT Schema.Table.Column FROM RemoteDB.Schema.Table;
The multi-part identifier "Schema.Table.Column" could not be bound.
链接服务器
作品
SELECT Column FROM LinkedServer.RemoteDB.Schema.Table;
SELECT Table.Column FROM LinkedServer.RemoteDB.Schema.Table;
SELECT Alias.Column FROM LinkedServer.RemoteDB.Schema.Table AS Alias;
失败
SELECT Schema.Table.Column FROM LinkedServer.RemoteDB.Schema.Table;
The multi-part identifier "Schema.Table.Column" could not be bound.
SELECT RemoteDB.Schema.Table.Column FROM LinkedServer.RemoteDB.Schema.Table;
The multi-part identifier "RemoteDB.Schema.Table.Column" could not be bound.
SELECT LinkedServer.RemoteDB.Schema.Table.Column FROM LinkedServer.RemoteDB.Schema.Table;
The multi-part identifier "LinkedServer.RemoteDB.Schema.Table.Column" could not be bound.
**I believe this fails are you're only allowed a maximum of 4 parts in the identifier?**
**Read this somewhere but nothing authoritive. Would appreciate a reference.**
同义词
作品
SELECT Column FROM SynonymName;
SELECT Column FROM SynonymSchema.SynonymName;
SELECT SynonymName.ColumnName FROM SynonymSchema.SynonymName;
SELECT SynonymSchema.SynonymName.Column FROM SynonymSchema.SynonymName;
SELECT Alias.Column FROM SynonymSchema.SynonymName AS Alias;
即使这样也行! (显然仅在使用 dbo Schema 时,但仍然如此)
SELECT SynonymSchema.SynonymName.Column FROM SynonymName;
- 我试图了解为什么某些多部分标识符在以一种方式使用(例如针对本地数据库的架构)时有效,但在以另一种方式使用时会失败(例如针对远程数据库/链接服务器的架构)。
- 您是否应该始终使用别名来确保一切正常?
任何建议都将受到高度赞赏,特别是有关“一刀切”场景的设计背后的原因和最佳实践建议的官方文档的指针(我目前推测这是别名路线) .
【问题讨论】:
-
永远不要在
SELECT中对列名使用三部分(+)命名。不推荐使用像SELECT dbo.MyTable.MyColumn FROM dbo.MyTable;这样的语法,并且您的 SQL 将在未来的某一天失败。如果您要引用特定表中的列,最好的方法是为该表添加别名,然后在该列前面加上该别名:SELECT MT.MyColumn FROM dbo.MyTable MT;。唯一一次您希望看到 3 部分 + 列的命名是在使用sp_rename时,因为它是必需的,这是因为列的名称是字符串文字参数。 -
@Larnu:谢谢你,请问你有任何关于弃用的文档链接吗?我觉得仅此一项就可以提供相当多的见解..
-
Deprecated Database Engine Features in SQL Server 2017:在“三部分和四部分列引用”下。。我不记得它被添加到弃用列表中的版本
-
太棒了,谢谢,这绝对是无价之宝。
标签: sql-server tsql sql-server-2016