在Management Studio中时,我试图在两个链接的服务器之间运行查询/联接。这是使用链接的数据库服务器的正确语法:
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
基本上,您是否只是将db服务器名称添加到db.table?
Answers:
格式应该是:
<server>.<database>.<schema>.<table>
例如:DatabaseServer1.db1.dbo.table1
更新:我知道这是一个老问题,我的答案是正确的;但是,我认为绊脚石的任何人都应该知道一些事情。
即,当在联接情况下查询链接服务器时,可能会将来自链接服务器的ENTIRE表下载到执行查询的服务器,以执行联接操作。在OP的情况下,from 和from 都将全部传输到执行查询的服务器(大概名为)。 table1
DB1
table1
DB2
DB3
如果您有大表,这可能会导致执行操作花费很长时间。毕竟,它现在受到网络流量速度的限制,而网络流量速度比内存甚至磁盘传输速度要慢几个数量级。
如果可能,请对远程服务器执行单个查询,而无需加入本地表,以将所需的数据提取到临时表中。然后查询一下。
如果这不可能,那么您需要查看导致SQL Server必须在本地加载整个表的各种情况。例如使用GETDATE()
甚至某些联接。其他表现杀手包括不给予适当的权利。
有关更多信息,请参见http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/。
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
这可能对您有帮助。
如果您仍然发现问题 <server>.<database>.<schema>.<table>
将服务器名称包含在 []
dbo.databaseserver1.db1.dbo.table1
对于这些其他答案有疑问的人,请尝试OPENQUERY
例:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
您需要指定架构/所有者(默认为dbo)作为引用的一部分。同样,最好使用较新的(ANSI-92)连接样式。
select foo.id
from databaseserver1.db1.dbo.table1 foo
inner join databaseserver2.db1.dbo.table1 bar
on foo.name = bar.name
select * from [Server].[database].[schema].[tablename]
这是正确的呼叫方式。执行查询之前,请确保验证服务器已链接!
要检查链接的服务器,请调用:
EXEC sys.sp_linkedservers
select name from drsql01.test.dbo.employee
我希望它有助于了解如何执行链接服务器的查询
通常,在链接服务器的情况下不应该使用直接查询,因为它大量使用SQL Server的临时数据库。第一步,将数据检索到临时DB中,然后进行过滤。关于这一点有很多线程。最好使用open OPENQUERY,因为它将SQL传递到源链接服务器,然后返回过滤结果,例如
SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
PostgreSQL:
您必须从查询中省略DBName:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from schema."tablename"')