在SQL Server中从两个不同的服务器中select数据

如何从两个不同的SQL Server服务器上的两个不同数据库中select相同查询中的数据?

是的你可以。

我想你在问什么,所以我会回答。

你在找什么是链接服务器。 您可以从对象资源pipe理器树中的以下位置在SSMS中find它们:

Server Objects-->Linked Servers

或者你可以使用sp_addlinkedserver 。

你只需要设置一个。 一旦你有了,你可以在另一台服务器上调用一个表,如下所示:

 select * from LocalTable, [OtherServerName].[OtherDB].[dbo].[OtherTable] 

请注意,所有者并不总是dbo ,所以请确保将其replace为您使用的任何模式。

你可以使用链接服务器来完成。

通常将链接的服务器configuration为使数据库引擎能够执行包含另一个SQL Server实例或另一个数据库产品(如Oracle)中的表的Transact-SQL语句。 许多types的OLE DB数据源可以configuration为链接服务器,包括Microsoft Access和Excel。

链接的服务器提供以下优点:

  • 从外部访问数据的能力。
  • 能够在整个企业的异构数据源上发布分布式查询,更新,命令和事务。
  • 类似地处理不同数据源的能力。

了解更多关于链接服务器

请按照以下步骤创build链接服务器:

  1. 服务器对象 – >链接服务器 – >新链接服务器

  2. 提供远程服务器名称。

  3. select远程服务器types(SQL Server或其他)。

  4. select“安全” – >“使用此安全上下文”,并提供远程服务器的login名和密码。

  5. 点击确定,你就完成了!

这里是创build链接服务器的简单教程。

要么

您可以使用查询添加链接的服务器。

句法:

 sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ] [ , [ @provider= ] 'provider_name' ] [ , [ @datasrc= ] 'data_source' ] [ , [ @location= ] 'location' ] [ , [ @provstr= ] 'provider_string' ] [ , [ @catalog= ] 'catalog' ] 

阅读有关sp_addlinkedserver的更多信息。

您只需创build一次链接服务器。 创build链接服务器后,我们可以按如下查询:

 select * from LinkedServerName.DatabaseName.OwnerName.TableName 
 SELECT * FROM [SERVER2NAME].[THEDB].[THEOWNER].[THETABLE] 

你也可以看看使用链接服务器。 链接的服务器也可以是其他types的数据源,例如DB2平台。 这是尝试从SQL Server TSQL或Sproc调用访问DB2的一种方法…

跨2个不同的数据库查询是一个分布式查询。 下面是一些技术加上利弊的列表:

  1. 链接服务器:提供比SQL Server复制提供的更广泛的数据源
  2. 链接的服务器:连接复制不支持的或需要临时访问的数据源
  3. 链接的服务器:执行比OPENDATASOURCE或OPENROWSET更好
  4. OPENDATASOURCEOPENROWSETfunction:便于从临时数据源中检索数据。 OPENROWSET也有BULK的设施,可能/可能不需要格式文件,可能是不知情的
  5. OPENQUERY :不支持variables
  6. 所有这些都是T-SQL解决scheme。 相对容易实施和build立
  7. 所有这些都依赖于源和destionation之间的连接,这可能会影响性能和可伸缩性

尝试这个:

 SELECT * FROM OPENROWSET('SQLNCLI', 'Server=YOUR SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a UNION SELECT * FROM OPENROWSET('SQLNCLI', 'Server=ANOTHER SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a 

这些都是很好的答案,但是这个不见了,它有它自己的强大的用途。 可能它不符合OP想要的,但问题是模糊的,我觉得其他人可能会在这里find方法。 基本上你可以使用1个窗口对多个服务器运行查询,具体如下:

在SSMS打开已注册的服务器,并在本地服务器组下创build一个新的 服务器组

在这个组下创build新的服务器注册你希望查询每个服务器。 如果数据库名称不同,请确保在属性中为每个名称设置默认值。

现在返回到您在第一步中创build的组,右键单击并select新build查询。 一个新的查询窗口将打开,并且您运行的任何查询将在组中的每个服务器上执行。 结果以单个数据集显示,并带有一个额外的列名,指示logging来自哪个服务器。 如果您使用状态栏,您会注意到服务器名称被replace为多个

在另一个服务器中创build一个链接服务器定义(您需要SA来执行此操作),然后仅使用四部分命名(请参阅BOL)引用它们。

  select * from [ServerName(IP)].[DatabaseName].[dbo].[TableName] 

Server 2008:

当SSMS连接到server1.DB1并尝试:

SELECT * FROM [server2]。[DB2]。[dbo]。[table1]

正如别人指出,如果它不工作,这是因为服务器没有链接…

我得到错误:无法findsys.servers中的服务器DB2。 validation是否指定了正确的服务器名称。 如有必要,执行存储过程sp_addlinkedserver将服务器添加到sys.servers。

添加服务器:参考:使用sp_addlinkedserver添加服务器链接:[1]: 使用sp_addlinkedserver添加服务器

要查看sys.servers中的内容,只需查询它:

 SELECT * FROM [sys].[servers] 

服务器对象—–>链接服务器—>新链接服务器在链接服务器为其他服务器编写服务器名称或IP地址,并selectSQL Server在安全性select(使用此安全上下文)写入其他login名和密码服务器

现在连接

从[服务器名称或IP地址] .databasename.dbo.tblname中select*

 sp_addlinkedserver('servername') 

所以它应该像这样 –

 select * from table1 unionall select * from [server1].[database].[dbo].[table1] 

我知道这是一个古老的问题,但我使用同义词。 假设查询在数据库服务器A中执行,并在数据库服务器B中查找服务器A上不存在的表。然后在从服务器B调用表的数据库上添加同义词。您的查询不必包括任何模式或不同的数据库名称,只需按照惯例调用表名称即可。

每个人都说连接服务器没有必要连接服务器。