SQL Server链接服务器示例查询

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来自DB1table1来自DB2将被完整地传送到执行查询的服务器,可能是命名的DB3.

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

如果可能,对远程服务器执行单个查询,而不加入本地表,以将所需数据提取到临时表中.然后查询.

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

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

  • 如果数据库服务器名称有连字符,需要用方括号括起来 (10认同)
  • @ bmw0128:更好的是,使用双引号:几乎每个平台都支持它,不像微软的方括号. (4认同)
  • 如果您不确定任何限定符,请在SSMS对象资源管理器中向下钻取到链接服务器中的表,右键单击,然后单击"脚本表","选择到"和"新建查询编辑器"窗口.生成的SELECT语句将包含表的正确的完全限定路径.我在使用Sybase时有一个神秘数据库限定符,这给了我正确的名称. (3认同)
  • 当数据库服务器名称中包含句点时,还需要使用方括号或双引号。 (2认同)

小智 27

SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
Run Code Online (Sandbox Code Playgroud)

这可能对你有所帮助.

  • 换句话说,这是创建传递查询.请记住,必须在服务器的本机SQL中编写查询语句.Oracle的语法与Teradata的不同之处不同于SQL Server等. (3认同)

小智 10

如果你仍然发现问题 <server>.<database>.<schema>.<table>

将服务器名称括起来 []


Joe*_*lli 8

您需要指定架构/所有者(默认情况下为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)

  • @ bmw0128:是的,有几个原因.恕我直言,最重要的是当你把桌子和连接放在两个不同的地方时,很容易意外地写一个跨产品连接. (2认同)

Tom*_*kel 8

对于那些有其他答案的人,请尝试OPENQUERY

例:

 SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]') 
Run Code Online (Sandbox Code Playgroud)


Shi*_*kin 7

右键单击表并单击脚本表作为选择

在此输入图像描述

  • 这展示了如何为链接表上的选择查询获取正确的语法。结果就像肖恩的回答 (4认同)
  • @ShimonDoodkin,一个很好的例子,不要给我鱼,但教我如何钓鱼 (3认同)

小智 5

select * from [Server].[database].[schema].[tablename] 
Run Code Online (Sandbox Code Playgroud)

这是正确的呼叫方式。执行查询之前,请确保验证服务器已链接!

要检查链接的服务器,请调用:

EXEC sys.sp_linkedservers 
Run Code Online (Sandbox Code Playgroud)