两部分表名的链接服务器命名问题

时间:2013-11-10 03:39:28

标签: sql sql-server linked-server

我有一个像reports.datasetstatus这样的表名,我试图使用以下查询的链接服务器查询它:

select [status] 
from   [server name].[database].dbo.reports.datasetstatus

通过此查询,我收到以下错误。

  

最多前缀为三个。

我将表名更改为[reports.datasetstatus],现在正在抛出未找到的表名错误,[[reports].[datasetstatus]]引发语法错误。

有人可以帮我解释这个语法吗?

2 个答案:

答案 0 :(得分:0)

我在链接服务器上创建了一个不明智的表名,并且能够访问它没有问题。在目标服务器上:

USE dbname;
GO
CREATE TABLE dbo.[report.datasetstatus](status INT);

然后在运行查询的服务器上:

SELECT [status] FROM [server].dbname.dbo.[report.datasetstatus];

这没问题。如果您收到一条错误消息,例如找不到表,则可能是因为您没有权限,拼写错误的表,或者它与dbo的模式不同。例如,如果表实际上在report架构中,那么您也不应该指定dbo

SELECT [status] FROM [server].dbname.report.datasetstatus;

当然,如果您的表名为report.datasetstatus,那么更智能的解决方案是首先不要使用这么糟糕的表名,无论是否涉及链接服务器。解决此问题的一种方法是使用.替换名称中的_

EXEC [server name].[database]..sp_rename 
    @objname = N'dbo.[report.datasetstatus]', 
    @newname = N'report_datasetstatus',
    @objtype = N'OBJECT';

答案 1 :(得分:0)

虽然server.database.owner.table语法可用,但在许多情况下,最好使用openquery。原因是如果你想这样做:

 select somefields
 from server.database.owner.tablename
 where whatever

将会发生什么是在应用where子句之前将遇到远程表的全部内容。如果表中有大量记录,那么您的查询将会非常缓慢。