• SQL Server 跨服务器操作


    Ø  简介

    在工作中编写 SQL 时经常会遇到跨库或跨服务器操作,比如查询时,通过 A 服务器的某张表关联 B 服务器某张表,进行连接查询。或者从另一台服务器中的数据,对当前数据库中的数据进行 CRUD 操作;又或者对远程服务器的数据进行 CRUD 操作。本文主要讨论在 SQL Server 中如何结合远程服务器中的数据进行操作,以及常用的几种方法。

     

    Ø  首先,模拟以下场景

    1.   A服务器(本地)有一张 Score(成绩)表,数据如下:

    clip_image001[12]

    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.   新建完成后就会出现在链接服务器列表中,如图:

    clip_image002[12]

     

    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.   结果

    clip_image003[12]

     

    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”的 STATEMENTOpenRowset/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.   结果

    clip_image004[11]

     

    6.   总结

    1)   本文介绍了常用的几种数据库跨服务器操作,链接服务器与 OPENQUERY() 函数的方式比较【推荐】使用,因为都是为某个链接服务器定义一个别名,使用起来比较方便。而 OPENROWSET/OPENDATASOURCE() 函数需要在每次使用时,都需要提供服务器地址、用户名、密码等,可以根据自己的需要选择对应的实现方式。

    2)   垮服务器操作数据库,前面举例了关联查询,另外还可以关联更新、删除等,这跟操作当前服务器并没有太大区别。

    3)   在跨服务器操作之前,首先需要确定远程服务器支持远程连接,如果不支持可参考https://www.cnblogs.com/abeam/p/8655035.html中的“设置数据库服务支持远程连接”进行相关设置。

  • 相关阅读:
    计算机网络
    AJAX
    数组---构建乘积数组
    数组----数组中的重复数字
    字符串---替换空格
    摘要评注The Cathedral & The Bazaar
    BlackJack Strategy
    招聘真题集合
    IIS+PHP+Mysql 返回500,服务器内部资源问题
    熄灯问题(枚举、位运算)
  • 原文地址:https://www.cnblogs.com/abeam/p/9188549.html
Copyright © 2020-2023  润新知