SQL Server链接服务器示例查询


93

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

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

基本上,您是否只是将db服务器名称添加到db.table?

Answers:


186

格式应该是:

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

例如:DatabaseServer1.db1.dbo.table1


更新:我知道这是一个老问题,我的答案是正确的;但是,我认为绊脚石的任何人都应该知道一些事情。

即,当在联接情况下查询链接服务器时,可能会将来自链接服务器的ENTIRE表下载到执行查询的服务器,以执行联接操作。在OP的情况下,from 和from 都将全部传输到执行查询的服务器(大概名为)。 table1DB1table1DB2DB3

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

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

如果这不可能,那么您需要查看导致SQL Server必须在本地加载整个表的各种情况。例如使用GETDATE()甚至某些联接。其他表现杀手包括不给予适当的权利。

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


11
如果数据库服务器名称带有连字符,则需要用方括号括起来
bmw0128,2010年

4
@ bmw0128:更好的是,使用双引号:几乎每个平台都支持它,这与Microsoft的方括号不同。

2
当数据库服务器名称中包含句点时,还需要使用方括号或双引号。
大卫·布鲁诺

4
如果不确定任何限定词,请在SSMS Object Explorer中的“链接服务器”中向下钻取一个表,右键单击,然后将“脚本表”另存为,“选择到”和“新查询编辑器”窗口。结果SELECT语句将包含正确的,完全限定的表路径。在使用Sybase时,我有一个神秘的数据库限定符,这给了我正确的名字。
约翰·莫

我认为您不能正确地说整个表都将被转移。您能否提供有关您从何处获得该信息的参考?我只是尝试对链接服务器上的一个具有2.04亿行(16GB数据,6.6GB索引)的表进行联接,并且链接到其中5行需要47ms,第二次查询需要7ms,因为大概是缓存了数据。也许,如果您的联接需要对链接表进行表扫描,则必须全部转移?
杰森·古玛


10

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

将服务器名称包含在 []


小心:我使用[]从select执行了一个创建表,而不是在链接服务器上创建该表,而是在本地创建了一个名称,例如dbo.databaseserver1.db1.dbo.table1
biscuit314


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

内部联接语法比隐式联接更可取?
bmw0128 '11

2
@ bmw0128:是的,有几个原因。恕我直言,最重要的是,当您将表和联接放在两个不同的位置时,意外编写跨产品联接太容易了。

请注意,对于某些非SQL Server链接的服务器,由4点组成的部分不起作用。它可能会引发如下错误:为链接服务器“ MyLinkedServer”的提供程序“ MSDASQL”指定了无效的架构或目录。
brewmanz

6
select * from [Server].[database].[schema].[tablename] 

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

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

EXEC sys.sp_linkedservers 

对于某些非SQL Server链接的服务器,这不起作用。它会引发如下错误:为链接服务器“ MyLinkedServer”的提供程序“ MSDASQL”指定了无效的架构或目录。
brewmanz

4
select name from drsql01.test.dbo.employee
  • drslq01是servernmae-链接的Serer
  • 测试是数据库名称
  • dbo是schema -default模式
  • 员工是表名

我希望它有助于了解如何执行链接服务器的查询


2

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

SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')

此答案不包含数据库名称
克里斯·内维尔

2
创建链接服务器时,我确实提供了数据库信息。有关详细信息,请参见下面的MSDN链接:msdn.microsoft.com/zh-cn/library/ff772782
v

如果链接服务器需要身份验证,而我只是想使用PDO从PHP应用程序查询,该怎么办?
nekiala

您将如何使用这种方法从数据库1连接到链接服务器上的数据库?
eaglei22 '19

2

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

SELECT * FROM [LINKED_SERVER] ... [TABLE]

我无法使用数据库名称来得到其他人的建议。此外,此数据源没有架构。



0

以下查询效果最佳。

试试这个查询:

SELECT * FROM OPENQUERY([LINKED_SERVER_NAME], 'SELECT * FROM [DATABASE_NAME].[SCHEMA].[TABLE_NAME]')

将MySQL链接到MS SQL非常有帮助


0

PostgreSQL

  1. 您必须在数据源DSN中提供数据库名称
  2. 管理员身份运行Management Studio
  3. 您必须从查询中省略DBName

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.