在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链接服务器:
-
服务器对象 – >链接服务器 – >新链接服务器
-
提供远程服务器名称。
-
select远程服务器types(SQL Server或其他)。
-
select“安全” – >“使用此安全上下文”,并提供远程服务器的login名和密码。
-
点击确定,你就完成了!
这里是创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个不同的数据库查询是一个分布式查询。 下面是一些技术加上利弊的列表:
- 链接服务器:提供比SQL Server复制提供的更广泛的数据源
- 链接的服务器:连接复制不支持的或需要临时访问的数据源
- 链接的服务器:执行比OPENDATASOURCE或OPENROWSET更好
- OPENDATASOURCE和OPENROWSETfunction:便于从临时数据源中检索数据。 OPENROWSET也有BULK的设施,可能/可能不需要格式文件,可能是不知情的
- OPENQUERY :不支持variables
- 所有这些都是T-SQL解决scheme。 相对容易实施和build立
- 所有这些都依赖于源和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调用表的数据库上添加同义词。您的查询不必包括任何模式或不同的数据库名称,只需按照惯例调用表名称即可。
每个人都说连接服务器没有必要连接服务器。