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议。 另外,这个数据源没有模式。