0

我有一个类似的表名reports.datasetstatus,我正在尝试使用具有以下查询的链接服务器来查询它:

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

使用此查询,我收到以下错误。

最大前缀为三个。

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

有人可以帮助我了解这种语法吗?

4

2 回答 2

0

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

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

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

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

这没有问题。如果您收到类似 table not found 之类的错误消息,则可能是因为您没有权限,您拼写错误的 table,或者它与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';
于 2013-11-10T04:05:05.030 回答
0

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

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

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

于 2013-11-10T04:52:56.867 回答