Ø  简介

在工作中编写 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 跨服务器操作的更多相关文章

  1. SQL Server跨服务器操作数据库

    今天给大家来分享一下跨服务器操作数据库,还是以SQL Server的管理工具(SSMS)为平台进行操作. 什么是跨服务器操作? 跨服务器操作就是可以在本地连接到远程服务器上的数据库,可以在对方的数据库 ...

  2. SQL Server跨服务器建立视图

    create view View_AppCus as select dwmch,zjm from ksoa.dbo.mchk SQL Server跨服务器操作经常需要用到,下面就为你介绍的是SQL S ...

  3. SQL Server跨服务器查询的实现方法,OpenDataSource

    SQL Server跨服务器查询的方法我们经常需要用到,下面就为您介绍两种SQL Server跨服务器查询的方法,如果您感兴趣的话,不妨一看. SQL Server跨服务器查询方法一:用OPENDAT ...

  4. 问题:sqlserver 跨服务器连接;结果:Sql Server 跨服务器连接

    Sql Server 跨服务器连接 用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset ...

  5. Sql Server 跨服务器连接

    用openrowset连接远程SQL或插入数据 --如果只是临时访问,可以直接用openrowset --查询示例 select * from openrowset('SQLOLEDB', 'sql服 ...

  6. sql server 跨库操作

    SELECT *FROM OPENDATASOURCE('SQLOLEDB','Data Source=sql服务器名;User ID=用户名;Password=密码;').PersonDb.dbo. ...

  7. SQL Server 跨服务器、跨版本使用复制 (2008、2012)

    在两台不同的服务器间实现SQL Server 的发布和订阅,需要一些设置. 测试环境:2008数据库.2012数据库,可实现跨版本发布订阅 本次测试是08的数据库做发布端 ,使用08数据及12数据库均 ...

  8. SQL Server 跨服务器快速数据转移

    最近遇到一个问题,要将 a 服务器上的 A 库,迁移到 b 服务器上的 B 库,两个库的数据结构是一样的,但是数据库版本是 a 比 b 高,通过 sqlserver  还原这条路是走不通了,那难道除了 ...

  9. SQL Server跨服务器的数据库迁移

    1. 使用sql server task中back up 任务,保存为*.bak 文件. 2. 在另一个server中restore database,如果已经存在这个database,会覆盖之前的数 ...

随机推荐

  1. c#操作SQL Server入门总结

    我是一名c#新手.本文只是我是常学习的随笔. 一.下载SQL server软件 听说下载开发板是最好的(开发板如果只是用来学习.研究不算是侵权).在安装的时候,我也遇到了很多问题,在公司的电脑安装第一 ...

  2. web Deploy发布问题

    使用vs开发的时候,经常会发布项目.传统发布是登陆远程桌面.或ftp这些发布都有一定的麻烦.不能灵活的管理发布的文件.因此后来研究了web Deploy,研究之后发现是很不错的发布工具.这里把我使用w ...

  3. Django学习笔记之表单验证

    表单概述 HTML中的表单 单纯从前端的html来说,表单是用来提交数据给服务器的,不管后台的服务器用的是Django还是PHP语言还是其他语言.只要把input标签放在form标签中,然后再添加一个 ...

  4. sklearn.linear_model.LogisticRegression参数说明

    目录 sklearn.linear_model.LogisticRegression sklearn.linear_model.LogisticRegressionCV sklearn.linear_ ...

  5. Redis入门之增删改查等常用命令总结

    Redis是用C语言实现的,一般来说C语言实现的程序"距离"操作系统更近,执行速度相对会更快. Redis使用了单线程架构,预防了多线程可能产生的竞争问题. 作者对于Redis源代 ...

  6. MySQL的运算符及其优先级

    +++++++++++++++++++++++++++++++++++++++++++标题:MySQL的常见运算符时间:2019年2月23日内容:MySQL的常见运算符重点:主要讲述MySQL常见运算 ...

  7. Day6 Numerical simulation of optical wave propagation之通过随机介质(如大气湍流)的传播(二)

    2.蒙特卡洛相位屏 大气折射率变化是一个随机的过程,通过大气的光程长度也同样是随机的.因此,湍流模型仅给出统计平均值,如折射率变量的结构函数和功率谱. 建立大气相位屏的问题就是产生随机过程独立表达式的 ...

  8. #Leetcode# 997. Find the Town Judge

    https://leetcode.com/problems/find-the-town-judge/ In a town, there are N people labelled from 1 to  ...

  9. 好久好久没写,,百度API逆地址解析以及删除指定marker

    百度地图Api中 除覆盖物有两个方法:map.removeOverlay()或者 map.clearOverlays(),其中 clearOverlays()方法一次移除所有的覆盖物removeOve ...

  10. java进阶学习的一些思路

    搞 Java 的年薪 40W 是什么水平? - 乔戈里的回答 - 知乎 https://www.zhihu.com/question/31437847/answer/566852748 在知乎上看了他 ...