SQL Server 跨服务器操作
Ø 简介
在工作中编写 SQL 时经常会遇到跨库或跨服务器操作,比如查询时,通过 A 服务器的某张表关联 B 服务器某张表,进行连接查询。或者从另一台服务器中的数据,对当前数据库中的数据进行 CRUD 操作;又或者对远程服务器的数据进行 CRUD 操作。本文主要讨论在 SQL Server 中如何结合远程服务器中的数据进行操作,以及常用的几种方法。
Ø 首先,模拟以下场景
1. A服务器(本地)有一张 Score(成绩)表,数据如下:

2. B 服务器(远程)有一张 Subject(科目)表,结构如下:
CREATE TABLE dbo.Subject
(
SubjectId tinyint NOT NULL, --科目Id
GradeId int NOT NULL, --年级Id
SubjectName nvarchar(25) NOT NULL, --名称
ClassHour smallint NOT NULL --课时
CONSTRAINT PK_Subject_SubjectId PRIMARY KEY CLUSTERED
(
SubjectId ASC
) ON [PRIMARY]
) ON [PRIMARY];
1. 使用链接服务器
Ø 首先新建链接服务器
1. 代码新建
--创建链接服务器
EXEC sp_addlinkedserver 'MyServer', '', 'SQLOLEDB', '服务器地址';
--登录服务器
EXEC sp_addlinkedsrvlogin 'MyServer', 'false', null, 'sa', 'Password';
--查询可用服务器
EXEC sp_helpserver;
--删除链接服务器(使用完记得删除)
EXEC sp_dropserver 'MyServer', 'droplogins';
2. 可视化新建
1) 某数据库服务器 -> 服务器对象 -> 链接服务器 -> 新建链接服务器。
2) 常规:链接服务器(服务器名称随便起) -> 其他数据源 -> 数据源(服务器地址) -> 其他选项可以为空。
3) 安全性:使用此安全上下文建立链接 -> 远程登录(输入 sa) -> 使用密码(输入密码)
3. 新建完成后就会出现在链接服务器列表中,如图:

1) 插入数据
INSERT INTO [MyServer].[DbName].[dbo].Subject VALUES
(1, 1, '数学', 286),(2, 1, '语文', 278),(3, 1, '英语', 291),
(5, 2, '语文', 288),(6, 2, '英语', 271);
2) 查询数据
1. SQL 代码
SELECT * FROM [MyServer].[DbName].[dbo].Subject;
2. 结果

3) 修改数据
UPDATE [MyServer].[DbName].[dbo].Subject SET SubjectName='物理' WHERE SubjectId=6;
4) 删除数据
DELETE FROM [MyServer].[DbName].[dbo].Subject WHERE SubjectId=6;
2. 使用 OPENQUERY() 函数
使用 OPENQUERY() 函数前,同样需要新建一个链接服务器,并向 OPENQUERY() 函数指定将使用的链接服务器。
1) 插入数据
INSERT INTO OPENQUERY(MyServer, 'SELECT * FROM [DbName].[dbo].Subject') VALUES
(1, 1, '数学', 286),(2, 1, '语文', 278),(3, 1, '英语', 291),
(5, 2, '语文', 288),(6, 2, '英语', 271);
2) 查询数据
SELECT * FROM OPENQUERY(MyServer, 'SELECT * FROM [DbName].[dbo].Subject');
3) 修改数据
UPDATE OPENQUERY(MyServer, 'SELECT * FROM [DbName].[dbo].Subject') SET SubjectName='物理' WHERE SubjectId=6;
4) 删除数据
DELETE FROM OPENQUERY(MyServer, 'SELECT * FROM [DbName].[dbo].Subject') WHERE SubjectId=6;
3. 使用 OPENROWSET() 函数
1) 插入数据
INSERT INTO OPENROWSET('SQLOLEDB', '服务器地址'; 'sa'; 'Password', DbName.dbo.Subject) VALUES
(1, 1, '数学', 286),(2, 1, '语文', 278),(3, 1, '英语', 291),
(5, 2, '语文', 288),(6, 2, '英语', 271);
2) 查询数据
SELECT * FROM OPENROWSET('SQLOLEDB', '服务器地址'; 'sa'; 'Password', DbName.dbo.Subject);
3) 修改数据
UPDATE OPENROWSET('SQLOLEDB', '服务器地址'; 'sa'; 'Password', DbName.dbo.Subject) SET SubjectName='物理' WHERE SubjectId=6;
4) 删除数据
DELETE FROM OPENROWSET('SQLOLEDB', '服务器地址'; 'sa'; 'Password', DbName.dbo.Subject) WHERE SubjectId=6;
4. 使用 OPENDATASOURCE() 函数
1) 插入数据
INSERT INTO OPENDATASOURCE('SQLOLEDB', 'Data Source=服务器地址;User ID=sa;Password=Password').DbName.dbo.Subject VALUES
(1, 1, '数学', 286),(2, 1, '语文', 278),(3, 1, '英语', 291),
(5, 2, '语文', 288),(6, 2, '英语', 271);
2) 查询数据
SELECT * FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=服务器地址;User ID=sa;Password=Password').DbName.dbo.Subject;
3) 修改数据
UPDATE OPENDATASOURCE('SQLOLEDB', 'Data Source=服务器地址;User ID=sa;Password=Password').DbName.dbo.Subject SET SubjectName='物理' WHERE SubjectId=6;
4) 删除数据
DELETE FROM OPENDATASOURCE('SQLOLEDB', 'Data Source=服务器地址;User ID=sa;Password=Password').DbName.dbo.Subject WHERE SubjectId=6;
5. 其他
1) 使用 OPENROWSET/OPENDATASOURCE() 函数时,如果报以下错误,则需要进行“分布式查询”设置:
1. 错误信息
SQL Server 阻止了对组件“Ad Hoc Distributed Queries”的 STATEMENT“OpenRowset/OpenDatasource”的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用“Ad Hoc Distributed Queries”。有关启用“Ad Hoc Distributed Queries”的详细信息,请搜索 SQL Server 联机丛书中的“Ad Hoc Distributed Queries”。
2. 开启/关闭“分布式查询”
--开启“分布式查询”
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;
--关闭“分布式查询”
EXEC sp_configure 'Ad Hoc Distributed Queries', 0;
RECONFIGURE;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;
2) 关联查询
1. SQL 代码
SELECT T1.*, T2.SubjectName FROM Score AS T1
LEFT JOIN [MyServer].[DbName].[dbo].Subject AS T2 ON(T1.SubjectId=T2.SubjectId);
2. 结果

6. 总结
1) 本文介绍了常用的几种数据库跨服务器操作,链接服务器与 OPENQUERY() 函数的方式比较【推荐】使用,因为都是为某个链接服务器定义一个别名,使用起来比较方便。而 OPENROWSET/OPENDATASOURCE() 函数需要在每次使用时,都需要提供服务器地址、用户名、密码等,可以根据自己的需要选择对应的实现方式。
2) 垮服务器操作数据库,前面举例了关联查询,另外还可以关联更新、删除等,这跟操作当前服务器并没有太大区别。
3) 在跨服务器操作之前,首先需要确定远程服务器支持远程连接,如果不支持可参考https://www.cnblogs.com/abeam/p/8655035.html中的“设置数据库服务支持远程连接”进行相关设置。
SQL Server 跨服务器操作的更多相关文章
- SQL Server跨服务器操作数据库
今天给大家来分享一下跨服务器操作数据库,还是以SQL Server的管理工具(SSMS)为平台进行操作. 什么是跨服务器操作? 跨服务器操作就是可以在本地连接到远程服务器上的数据库,可以在对方的数据库 ...
- SQL Server跨服务器建立视图
create view View_AppCus as select dwmch,zjm from ksoa.dbo.mchk SQL Server跨服务器操作经常需要用到,下面就为你介绍的是SQL S ...
- SQL Server跨服务器查询的实现方法,OpenDataSource
SQL Server跨服务器查询的方法我们经常需要用到,下面就为您介绍两种SQL Server跨服务器查询的方法,如果您感兴趣的话,不妨一看. SQL Server跨服务器查询方法一:用OPENDAT ...
- 问题:sqlserver 跨服务器连接;结果:Sql Server 跨服务器连接
Sql Server 跨服务器连接 用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset ...
- Sql Server 跨服务器连接
用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset('SQLOLEDB', 'sql服 ...
- sql server 跨库操作
SELECT *FROM OPENDATASOURCE('SQLOLEDB','Data Source=sql服务器名;User ID=用户名;Password=密码;').PersonDb.dbo. ...
- SQL Server 跨服务器、跨版本使用复制 (2008、2012)
在两台不同的服务器间实现SQL Server 的发布和订阅,需要一些设置. 测试环境:2008数据库.2012数据库,可实现跨版本发布订阅 本次测试是08的数据库做发布端 ,使用08数据及12数据库均 ...
- SQL Server 跨服务器快速数据转移
最近遇到一个问题,要将 a 服务器上的 A 库,迁移到 b 服务器上的 B 库,两个库的数据结构是一样的,但是数据库版本是 a 比 b 高,通过 sqlserver 还原这条路是走不通了,那难道除了 ...
- SQL Server跨服务器的数据库迁移
1. 使用sql server task中back up 任务,保存为*.bak 文件. 2. 在另一个server中restore database,如果已经存在这个database,会覆盖之前的数 ...
随机推荐
- Linux内存管理 (1)物理内存初始化
专题:Linux内存管理专题 关键词:用户内核空间划分.Node/Zone/Page.memblock.PGD/PUD/PMD/PTE.lowmem/highmem.ZONE_DMA/ZONE_NOR ...
- 基于 HTML5 WebGL 的 3D 棉花加工监控系统
前言 现在的棉花加工行业还停留在传统的反应式维护模式当中,当棉花加下厂的设备突然出现故障时,控制程序需要更换.这种情况下,首先需要客户向设备生产厂家请求派出技术人员进行维护,然后生产厂家才能根据情况再 ...
- Scratch不仅适合小朋友,程序员和大学老师都应该广泛使用!!!
去年接触到了Scratch这个编程工具,它是一种简易图形化编程工具,这个软件的开发团队来自于麻省理工大学称为“终身幼儿园团队”(Lifelong Kindergarten Group). 网址http ...
- You earned your Program Management Professional (PgMP)® Credential
You earned your Program Management Professional (PgMP)® Credential. pasting
- 小小知识点(三)——MATLAB如何把三维图用二维图表示
MATLAB程序: x=-1:0.1:1; [x y] = meshgrid(x); %grid data = load("filename.txt"); figure mesh( ...
- 基于开发者中心DevOps流水线快速上云
导读:“DevOps”这个词现在很流行,它具体指的是什么呢?本文介绍了DevOps和开发者中心DevOps流水线,图文并茂,解答您的疑惑. 那么DevOps是什么?开发者中心<DevOps流水线 ...
- python中的编码问题
遇到的问题: (1)ValueError: source code string cannot contain null bytes 发现文件的编码被改成了UTF-16BE,使用pycharm设置项目 ...
- iView组件添加API中介绍的事件的方式(render方式添加事件)
iView组件好用,文档齐全,品质可靠稳定.最大的好处是使用了Vue框架,使很多数据绑定和交互问题变的轻松,是难得的开源前端组件.给作者点个赞.用这个组件来学习Vue.js也是不错的选择. 最近用的比 ...
- Web App架构
Web App 架构分为两种:一种是工程架构,一种是项目架构. 工程架构则主要有以下几个方面的内容: 1, 解放生产力,我们希望在开发项目的过程中把全部目光都放到书写业务代码上,不需要去考虑一些重复性 ...
- spoj 839-Optimal Marks
Description SPOJ.com - Problem OPTM Solution 容易发现各个位之间互不影响, 因此分开考虑每一位. 考虑题中是怎样的一个限制: 对每个点确定一个0/1的权值; ...