我有一个像reports.datasetstatus
这样的表名,我试图使用以下查询的链接服务器查询它:
select [status]
from [server name].[database].dbo.reports.datasetstatus
通过此查询,我收到以下错误。
最多前缀为三个。
我将表名更改为[reports.datasetstatus]
,现在正在抛出未找到的表名错误,[[reports].[datasetstatus]]
引发语法错误。
有人可以帮我解释这个语法吗?
答案 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子句之前将遇到远程表的全部内容。如果表中有大量记录,那么您的查询将会非常缓慢。