bmw*_*128 87 sql-server linked-server
在Management Studio中,我正在尝试运行查询/在两个链接的服务器之间进行连接.这是使用链接数据库服务器的正确语法:
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
Run Code Online (Sandbox Code Playgroud)
基本上,您是否只将db服务器名称添加到db.table?
Not*_*tMe 173
格式应该是:
<server>.<database>.<schema>.<table>
Run Code Online (Sandbox Code Playgroud)
例如:DatabaseServer1.db1.dbo.table1
更新:我知道这是一个老问题,我的答案是正确的; 但是,我认为任何其他绊脚石的人应该知道一些事情.
即,当在连接情况下查询链接服务器时,来自链接服务器的ENTIRE表可能会被下载到执行查询的服务器以进行连接操作.在OP的情况下,table1来自DB1和table1来自DB2将被完整地传送到执行查询的服务器,可能是命名的DB3.
如果您有大表,这可能会导致执行需要很长时间的操作.毕竟它现在受网络流量速度的限制,网络流量速度比内存或甚至磁盘传输速度慢几个数量级.
如果可能,对远程服务器执行单个查询,而不加入本地表,以将所需数据提取到临时表中.然后查询.
那是不可能的,那么你需要查看会导致SQL服务器必须在本地加载整个表的各种事情.例如,使用GETDATE()甚至是某些连接.其他表演杀手包括不给予适当的权利.
有关更多信息,请参见http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/.
小智 27
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
Run Code Online (Sandbox Code Playgroud)
这可能对你有所帮助.
您需要指定架构/所有者(默认情况下为dbo)作为引用的一部分.此外,最好使用较新的(ANSI-92)连接方式.
select foo.id
from databaseserver1.db1.dbo.table1 foo
inner join databaseserver2.db1.dbo.table1 bar
on foo.name = bar.name
Run Code Online (Sandbox Code Playgroud)
对于那些有其他答案的人,请尝试OPENQUERY
例:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
Run Code Online (Sandbox Code Playgroud)
右键单击表并单击脚本表作为选择
小智 5
select * from [Server].[database].[schema].[tablename]
Run Code Online (Sandbox Code Playgroud)
这是正确的呼叫方式。执行查询之前,请确保验证服务器已链接!
要检查链接的服务器,请调用:
EXEC sys.sp_linkedservers
Run Code Online (Sandbox Code Playgroud)