如何从SQL Server中两个不同服务器上的两个不同数据库中选择同一查询中的数据?
当前回答
添加链接服务器的简化解决方案
第一个服务器
EXEC sp_addlinkedserver @server='ip,port\instancename'
第二次登录
EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'
执行从链接到本地db的查询
INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]
其他回答
跨2个不同的数据库进行查询是一种分布式查询。以下是一些技巧及其优缺点:
Linked servers: Provide access to a wider variety of data sources than SQL Server replication provides Linked servers: Connect with data sources that replication does not support or which require ad hoc access Linked servers: Perform better than OPENDATASOURCE or OPENROWSET OPENDATASOURCE and OPENROWSET functions: Convenient for retrieving data from data sources on an ad hoc basis. OPENROWSET has BULK facilities as well that may/may not require a format file which might be fiddley OPENQUERY: Doesn't support variables All are T-SQL solutions. Relatively easy to implement and set up All are dependent on connection between source and destionation which might affect performance and scalability
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
您还可以使用链接服务器。链接服务器也可以是其他类型的数据源,比如DB2平台。这是一种尝试从SQL Server TSQL或Sproc调用访问DB2的方法…
这些都是很好的答案,但这一个是缺失的,它有自己强大的用途。这可能不符合OP的要求,但问题很模糊,我觉得其他人可能会找到他们的方式。基本上你可以使用一个窗口同时对多个服务器运行查询,下面是如何做到的:
在SSMS中打开注册服务器并在本地服务器组下创建一个新服务器组。
在该组下,为您希望查询的每个服务器创建新服务器注册。如果DB名称不同,请确保在属性中为每个DB名称设置默认值。
现在回到第一步中创建的Group,右键单击并选择New Query。将打开一个新的查询窗口,您运行的任何查询都将在组中的每个服务器上执行。结果显示在一个单独的数据集中,其中有一个额外的列名,表示该记录来自哪个服务器。如果您使用状态栏,您将注意到服务器名称被多个替换。
我在连接SQL_server 2008到远程服务器上托管的SQL_server 2016时遇到了同样的问题。其他的答案对我来说并不直接。我把我的调整解决方案写在这里,因为我认为它可能对其他人有用。
远程IP db连接的扩展答案:
步骤1:连接服务器
EXEC sp_addlinkedserver @server='SRV_NAME',
@srvproduct=N'',
@provider=N'SQLNCLI',
@datasrc=N'aaa.bbb.ccc.ddd';
EXEC sp_addlinkedsrvlogin 'SRV_NAME', 'false', NULL, 'your_remote_db_login_user', 'your_remote_db_login_password'
...其中SRV_NAME是一个虚构的名称。我们将使用它从查询中引用远程服务器。aaa.bbb.ccc.ddd是SQLserver DB的远程服务器的ip地址。
步骤2:运行查询 例如:
SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table
...就是这样!
语法详细信息:sp_addlinkedserver和sp_addlinkedsrvlogin
sp_addlinkedserver('servername')
所以它应该是这样的
select * from table1
unionall
select * from [server1].[database].[dbo].[table1]
推荐文章
- GROUP BY with MAX(DATE)
- 删除id与其他表不匹配的sql行
- 等价的限制和偏移SQL Server?
- 如何从SQL Server中的字符串中剥离所有非字母字符?
- 为什么我不能在DELETE语句中使用别名?
- 在SQL Server Management Studio中保存带有标题的结果
- "where 1=1"语句
- 如何选择一个记录和更新它,与一个单一的查询集在Django?
- 多语句表值函数vs内联表值函数
- 如何从Oracle的表中获取列名?
- NOLOCK提示在SELECT语句中的作用
- SQL OVER()子句-它什么时候有用,为什么有用?
- 如果字段在MySQL中为空,则返回0
- 检查SQL Server登录是否已经存在
- 我如何使用ROW_NUMBER()?