SQL Server链接服务器示例查询

在Management Studio中,我试图运行两个链接服务器之间的查询/连接。 这是使用链接数据库服务器的正确语法:

select foo.id from databaseserver1.db1.table1 foo, databaseserver2.db1.table1 bar where foo.name=bar.name 

基本上,你只是在数据库服务器的名称前面db.table?

格式应该可能是:

 <server>.<database>.<schema>.<table> 

例如:DatabaseServer1.db1.dbo.table1


更新 :我知道这是一个老问题,我的答案是正确的; 不过,我觉得其他任何人都应该知道这件事。

也就是说,当在连接情况下查询链接服务器时,链接服务器中的ENTIRE可能会被下载到执行查询的服务器上,以便执行连接操作。 在OP的情况下,来自DB1 table1和来自DB2 table1将全部传送到执行查询的服务器,大概名为DB3

如果您有大表,这可能会导致需要很长时间才能执行的操作。 毕竟它现在受到networkingstream量速度的限制,比内存或磁盘传输速度慢几个数量级。

如果可能的话,对远程服务器执行单个查询,而不join本地表,将需要的数据提取到临时表中。 然后查询closures。

这是不可能的,那么你需要看看导致SQL服务器必须在本地加载整个表的各种事情。 例如使用GETDATE()甚至某些连接。 其他performance杀手包括没有给予适当的权利。

有关更多信息,请参阅http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/

您需要指定模式/所有者(默认为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 OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME') 

这可能会帮助你。

对于那些有这些其他答案的麻烦 ,请尝试OPENQUERY

例:

  SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]') 

通常,在链接服务器的情况下,不应该使用直接查询,因为它大量使用SQL服务器的临时数据库。 在第一步,数据被检索到临时数据库中,然后进行过滤。 有很多关于这个的话题。 最好使用open OPENQUERY,因为它将SQL传递给源链接服务器,然后返回过滤结果,例如

 SELECT * FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500') 
 select * from [Server].[database].[schema].[tablename] 

这是打电话的正确方法。 执行查询之前一定要确认服务器已经链接了!

要检查连接的服务器调用:

 EXEC sys.sp_linkedservers 

对于它的价值,我发现以下语法是最好的:

SELECT * FROM [LINKED_SERVER] … [TABLE]

我无法使用数据库名称获得其他人的build议。 另外,这个数据源没有模式。