2010-11-03 44 views
61

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

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

基本上,你只是在前面加上DB服务器名称为db.table?

回答

132

格式也许应该是:

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

例如: DatabaseServer1.db1.dbo.table1


更新:我知道这是一个老问题,答案我有正确的;不过,我认为任何其他人都应该知道这件事情。

即从链接服务器连接中的情况下对链接的服务器查询表时,将可能是为了做连接操作下载到查询从执行服务器。在OP的情况下,来自DB1table1和来自DB2table1两者将全部转移到执行查询的服务器,推测其名称为DB3

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

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

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

请参阅http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/了解更多信息。

+9

如果数据库eserver名称有一个连字符,需要用方括号括起来 – bmw0128 2010-11-03 22:15:47

+4

@ bmw0128:更好的是,使用双引号:几乎所有平台都支持它,与微软的方括号不同。 – 2012-07-03 22:29:10

+1

当数据库服务器名称中包含句点时,还需要使用方括号或双引号。 – 2014-05-09 21:55:57

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 
+0

内部连接语法优于隐式连接? – bmw0128 2010-11-03 22:17:10

+2

@ bmw0128:是的,有几个原因。恕我直言,最重要的是,当你在两个不同的地方有你的表和连接时,意外地写一个跨产品连接是太容易了。 – 2012-07-03 22:30:47

+0

请注意,4点零件不适用于某些非SQL Server连接的服务器。它可能引发错误,例如...为链接服务器“MyLinkedServer”的提供程序“MSDASQL”指定了无效的模式或目录。 – brewmanz 2017-01-12 21:45:29

7

如果仍然发现有问题......

括服务器名称[]

+0

小心:我用选择使用[]执行了一个创建表,而不是在链接服务器上创建的,该表是在本地创建的,名称为'dbo.databaseserver1.db1.dbo.table1' – biscuit314 2017-06-13 15:59:55

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

这是调用正确的方法。 确保在执行查询之前验证服务器已链接!

要检查链接服务器调用:

EXEC sys.sp_linkedservers 
+0

这不适用于一些非SQL Server连接的服务器。它引发错误,如...为链接服务器“MyLinkedServer”的提供程序“MSDASQL”指定了无效的模式或目录。 – brewmanz 2017-01-12 21:40:41

1

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

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

此答案不包括数据库名称 – 2016-04-22 10:37:27

+2

我在创建链接服务器时提供了数据库信息。有关详细信息,请参阅下面的MSDN链接: https://msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx – 2016-10-20 14:09:38

+0

如果我的链接服务器要求身份验证,并且我'只是试图从我的PHP应用程序使用PDO查询? – nekiala 2017-06-22 08:22:37

8
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME') 

这可能会帮助你。

+0

Upvoted。当你将MySQL链接到MS SQL时,这是有效的。 – 2017-02-07 01:27:27

+1

换句话说,这是创建传递查询。请记住,查询语句必须写入服务器的本机SQL中。 Oracle的语法与Teradata不同于SQL Server等。 – AxGryndr 2017-07-13 14:29:38

3

对于那些与这些其他答案麻烦,试着OPENQUERY

例子:

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

适用于SQL Server – 2017-02-07 18:46:34

0

对于它的价值,我发现下面的语法最好的工作:

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

我无法得到其他人的建议使用数据库名称来工作。另外,这个数据源没有模式。

1
select name from drsql01.test.dbo.employee 
  • drslq01是servernmae --linked塞雷尔语
  • 测试数据库名称
  • DBO是架构-default模式
  • 员工表名

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