在Management Studio中,我试图运行两个链接服务器之间的查询/连接。 这是使用连接数据库服务器正确的语法:SQL Server链接服务器示例查询
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
基本上,你只是在前面加上DB服务器名称为db.table?
在Management Studio中,我试图运行两个链接服务器之间的查询/连接。 这是使用连接数据库服务器正确的语法:SQL Server链接服务器示例查询
select foo.id
from databaseserver1.db1.table1 foo,
databaseserver2.db1.table1 bar
where foo.name=bar.name
基本上,你只是在前面加上DB服务器名称为db.table?
格式也许应该是:
<server>.<database>.<schema>.<table>
例如: DatabaseServer1.db1.dbo.table1
更新:我知道这是一个老问题,答案我有正确的;不过,我认为任何其他人都应该知道这件事情。
即从链接服务器连接中的情况下对链接的服务器查询整表时,将可能是为了做连接操作下载到查询从执行服务器。在OP的情况下,来自DB1
的table1
和来自DB2
的table1
两者将全部转移到执行查询的服务器,推测其名称为DB3
。
如果你有大表,这个可能导致需要很长时间才能执行的操作。毕竟它现在受到网络流量速度的限制,速度比内存或磁盘传输速度慢几个数量级。
如果可能,对远程服务器执行单个查询,而无需连接到本地表,以将需要的数据提取到临时表中。然后查询。
这是不可能的,那么你需要看看会导致SQL服务器必须在本地加载整个表的各种事情。例如使用GETDATE()
甚至某些连接。其他表现杀手包括没有给予适当的权利。
请参阅http://thomaslarock.com/2013/05/top-3-performance-killers-for-linked-server-queries/了解更多信息。
您需要指定模式/所有者(默认为dbo)作为参考的一部分。另外,最好使用更新的(ANSI-92)连接样式。
select foo.id
from databaseserver1.db1.dbo.table1 foo
inner join databaseserver2.db1.dbo.table1 bar
on foo.name = bar.name
如果仍然发现有问题......
括服务器名称[]
小心:我用选择使用[]执行了一个创建表,而不是在链接服务器上创建的,该表是在本地创建的,名称为'dbo.databaseserver1.db1.dbo.table1' – biscuit314 2017-06-13 15:59:55
select * from [Server].[database].[schema].[tablename]
这是调用正确的方法。 确保在执行查询之前验证服务器已链接!
要检查链接服务器调用:
EXEC sys.sp_linkedservers
这不适用于一些非SQL Server连接的服务器。它引发错误,如...为链接服务器“MyLinkedServer”的提供程序“MSDASQL”指定了无效的模式或目录。 – brewmanz 2017-01-12 21:40:41
通常直接查询不应该在链接服务器的情况下使用,因为它大量使用SQL服务器的临时数据库。首先,数据被检索到临时数据库中,然后进行过滤。有很多关于这个的线索。最好使用open OPENQUERY,因为它将SQL传递给源链接服务器,然后返回过滤结果,例如
SELECT *
FROM OPENQUERY(Linked_Server_Name , 'select * from TableName where ID = 500')
此答案不包括数据库名称 – 2016-04-22 10:37:27
我在创建链接服务器时提供了数据库信息。有关详细信息,请参阅下面的MSDN链接: https://msdn.microsoft.com/en-us/library/ff772782(v=sql.110).aspx – 2016-10-20 14:09:38
如果我的链接服务器要求身份验证,并且我'只是试图从我的PHP应用程序使用PDO查询? – nekiala 2017-06-22 08:22:37
SELECT * FROM OPENQUERY([SERVER_NAME], 'SELECT * FROM DATABASE_NAME..TABLENAME')
这可能会帮助你。
Upvoted。当你将MySQL链接到MS SQL时,这是有效的。 – 2017-02-07 01:27:27
换句话说,这是创建传递查询。请记住,查询语句必须写入服务器的本机SQL中。 Oracle的语法与Teradata不同于SQL Server等。 – AxGryndr 2017-07-13 14:29:38
对于那些与这些其他答案麻烦,试着OPENQUERY
例子:
SELECT * FROM OPENQUERY([LinkedServer], 'select * from [DBName].[schema].[tablename]')
适用于SQL Server – 2017-02-07 18:46:34
对于它的价值,我发现下面的语法最好的工作:
SELECT * FROM [LINKED_SERVER] ... [TABLE]
我无法得到其他人的建议使用数据库名称来工作。另外,这个数据源没有模式。
select name from drsql01.test.dbo.employee
我希望它有助于理解,如何执行查询链接服务器
如果数据库eserver名称有一个连字符,需要用方括号括起来 – bmw0128 2010-11-03 22:15:47
@ bmw0128:更好的是,使用双引号:几乎所有平台都支持它,与微软的方括号不同。 – 2012-07-03 22:29:10
当数据库服务器名称中包含句点时,还需要使用方括号或双引号。 – 2014-05-09 21:55:57