在Management Studio中,我正在尝试在两个链接服务器之间运行查询/执行联接。下面的SQL语句是否正确:
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
基本上,您只需要在数据库表名前加上数据库服务器名称吗?
在Management Studio中,我正在尝试在两个链接服务器之间运行查询/执行联接。下面的SQL语句是否正确:
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
基本上,您只需要在数据库表名前加上数据库服务器名称吗?
格式应该是这样的:
<server>.<database>.<schema>.<table>
更新: 我知道这是一个旧问题,我所提供的答案是正确的;然而,我认为任何碰巧遇到这个问题的人都应该知道一些事情。
特别是,在连接服务器时查询加入操作时,来自链接服务器的整个表格将可能会被下载到执行查询的服务器上以执行加入操作。在OP的情况下,来自DB1
的table1
和来自DB2
的table1
都将完整传输到执行查询的服务器上,假设其名称为DB3
。
如果您有大型表格,则可能导致操作需要很长时间才能执行。毕竟,它现在受限于网络流量速度,这比内存甚至磁盘传输速度慢几个数量级。
如果可能,执行针对远程服务器的单个查询,而不连接到本地表格,以将所需数据提取到临时表中。然后从那里进行查询。
如果这不可能,那么您需要查看各种会导致SQL服务器必须在本地加载整个表格的原因。例如使用GETDATE()
或甚至某些连接。其他性能杀手包括不提供适当的权限。
请参见http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/获取更多信息。
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
这可能会对您有所帮助。
对于那些对其他答案感到困惑的人,请尝试使用OPENQUERY
示例:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
SELECT * INTO NEW_DB.dbo.tblCopy FROM OLD_DB.dbo.tblData
形式变为 SELECT * INTO NEW_DB.dbo.tblCopy FROM OPENQUERY([server], 'select * from OLD_DB.dbo.tblData')
。 - baltermia<server>.<database>.<schema>.<table>
方面遇到问题,
请将服务器名称用[]
括起来。dbo.databaseserver1.db1.dbo.table1
的表。 - biscuit314select 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 的临时数据库。首先将数据检索到临时数据库中,然后进行过滤。这方面有很多讨论。最好使用 OPENQUERY, 因为它可以将 SQL 传递到源链接服务器,然后返回经过过滤的结果,例如:
SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
SELECT * FROM [SERVER_NAME].[DATABASE_NAME].[SCHEMA_NAME].[TABLE_NAME]
OPENQUERY
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME.SCHEMA_NAME.TABLENAME')
总的来说,OPENQUERY在大多数情况下似乎是更好的选择。