zoukankan      html  css  js  c++  java
  • SQL Server不同服务器不同数据库间的操作

    什么是跨服务器操作?

    跨服务器操作就是可以在本地连接到远程服务器上的数据库,可以在对方的数据库上进行相关的数据库操作,比如增删改查。

    为什么要进行跨服务器操作

    随着数据量的增多,业务量的扩张,需要在不同的服务器安装不同的数据库,有时候因为业务需要,将不同的服务器中的数据进行整合,这时候就需要进行跨服务器操作了。

    跨服务器操作的工具是什么?

    DBLINK(数据库链接),顾名思义就是数据库的链接,就像电话线一样,是一个通道,当我们要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。

    一、不同服务器不同数据库:

    图形创建SQL Server远程链接:

    1. 登录到本地数据库-->服务器对象-->链接服务器(右键)-->新建链接服务器

    2. 在弹出的对话框中输入相关信息

    3. 点击左侧“安全性”,出现以下页面,输入对方数据库的账号密码即可

    4. 点击“确定”后即创建成功,如下图可以看到创建好的链接服务器

    5. 下面使用创建好的链接试着查询对方服务器的表来验证一下

    原文地址:http://baijiahao.baidu.com/s?id=1601340639397887562&wfr=spider&for=pc

    代码创建SQL Server远程链接:

    1. 创建链接服务器

    1.1 创建一个链接名

    exec sp_addlinkedserver 'LinkName', '', 'SQLOLEDB', '远程服务器名或ip地址'   --有自定义实例名还要加上"/实例名"
    /*例如:exec sp_addlinkedserver 'TonyLink', '', 'SQLOLEDB', '192.168.2.110' */  

    1.2 创建登录信息(或叫创建链接服务器登录名映射)(只需选择一种方式)

    1.2.1 以windows认证的方式登录

    exec sp_addlinkedsrvlogin 'LinkName'  --或exec sp_addlinkedsrvlogin 'LinkName', 'true'
    
     /*例如:exec sp_addlinkedsrvlogin 'TonyLink'  */  

    1.2.2 以SQL认证的方式登录                                                                    

    exec sp_addlinkedsrvlogin 'LinkName', 'false', NULL, '用户名', '密码'
    
    /*例如:exec sp_addlinkedsrvlogin 'TonyLink', 'false', null, 'sa', '123456' */

     

    2. 链接服务器相关数据操作

    2.1 查询

    select * from LinkName.数据库名.架构名.表名
    
    /*例如:select * from TonyLink.LoadData.dbo.XimaArea */

    2.2 把远程数据库查询的数据新增导入到本地表(本地表不需要提前存在,会自动创建)

    select  * into 表名 from LinkName.数据库名.架构名.表名
    
    /*例如:select * into Newtb fromTonyLink.LoadData.dbo.XimaArea */

    2.3 更新

    update LinkName.数据库名.架构名.表名 set 字段='' where 字段='条件'
    
    /*例如:update TonyLink.LoadData.dbo.XimaArea set area='中华区' where areaid=8 */

    2.4 删除

    delete LinkName.数据库名.架构名.表名 where 字段名='条件'
    
    /*例如:delete TonyLink.LoadData.dbo.XimaArea where areaid=1 */

    不再使用时删除链接服务器

    exec sp_dropserver 'LinkName', 'droplogins'

    3. 通过行集函数(openquery/openrowset/opendatasource)操作方法

    3.1 openquery 方法(需要借助刚创建的链接服务器):

    3.1.1 查询

    select * from openquery(linkname, 'select * from 数据库名.架构名.表名')
    
    /* 例如:select * from openquery(TonyLink, 'select * from LoadData.dbo.XimaArea') */

    3.1.2 导入

    3.1.2.1 把本地表(本地表需要提前存在)导入到远程表(两表之间列要对应)
    insert openquery(linkname, 'select * from 数据库名.架构名.表名') select * from 本地表
    
    /* 例如:insert openquery(TonyLink, 'select area from LoadData.dbo.XimaArea') select area from ttt */
    3.1.2.2 把本地表(本地表需要提前存在)指定列导入远程表(两表之间列要对应)
    insert openquery(linkname, 'select * from 数据库名.架构名.表名') (列, 列...)
    
    select 列, 列... from 本地表
    
    /* 例如:insert openquery(TonyLink,'select * from LoadData.dbo.ximajxs')(jxsName, consignee, address)
    
        select jxsName, consignee, address from ttt  */

    3.1.3 更新

    update openquery(linkname, 'select * from 数据库名.架构名.表名') set 字段='' where 字段='条件'
    
    /*例如:update openquery(TonyLink, 'select * from LoadData.dbo.ximajxs') set JxsName='北京有限公司' where jxsId=10 */

    3.1.4 删除

    delete openquery(linkname, 'select * from 数据库名.架构名.表名') where 字段名='条件'
    
    /*例如:delete openquery(TonyLink, 'select * from LoadData.dbo.ximajxs') where jxsId=10 */

    3.2 openrowset:

    3.2.1 查询

    select * from openrowset('SQLOLEDB', 'SQL服务器名'; '用户名'; '密码', 数据库名.dbo.表名)

    报错问题:

    解决方法:

    在数据库服务实例名(如图1-3,GP-PCsql2008位置)点击鼠标右键【方面】,在窗口【查看方面】— 点击【常规】— 【方面】— 选择【外围应用配置器】,找到【AdHocRemoteQueriesEnabled】— 选择【True】— 点击【确定】

    3.2.2 生成本地表

    select * into 表名 from openrowset('SQLOLEDB', 'SQL服务器名'; '用户名'; '密码', 数据库名.dbo.表名)

    3.2.3 把本地表导入到远程表

    insert openrowset('SQLOLEDB', 'SQL服务器名'; '用户名'; '密码', 数据库名.dbo.表名)
    
    select * from 本地表

    3.2.4 更新本地表

    update b
    set b.address = a.area
    from openrowset('SQLOLEDB', '192.168.2.110'; 'sa'; '123456', LoadData.dbo.XimaArea) as a
    inner join ttt b
    on a.areaid=b.areaid

    3.3 opendatasource

    3.3.1  查询

    select * from opendatasource('SQLOLEDB', 'Data Source=192.168.2.110; uid=sa; pwd=123456').LoadData.dbo.XimaArea

     4. 具体例子

    if exists(select 1 from master.dbo.sysservers where srvname='linktest')
    begin
        exec sys.sp_droplinkedsrvlogin 'linktest', 'sa'
        exec sys.sp_dropserver 'linktest'
    end
    
    exec sys.sp_addlinkedserver
        @server = 'linktest', -- sysname
        @srvproduct = N'', -- nvarchar(128)
        @provider = N'SQLOLEDB', -- nvarchar(128)
        @datasrc = N'192.168.2.110' -- nvarchar(4000)
    
    exec sys.sp_addlinkedsrvlogin 
        @rmtsrvname = 'linktest', -- sysname
        @useself = 'false', -- varchar(8)
        @locallogin = null, -- sysname
        @rmtuser = 'sa', -- sysname
        @rmtpassword = '123456' -- sysname
    
    select * from linktest.LoadData.dbo.ximalss
    
    if exists(select 1 from master.dbo.sysservers where srvname='linktest')
    begin
        exec sys.sp_droplinkedsrvlogin 'linktest', 'sa'
        exec sys.sp_dropserver 'linktest'
    end
    
    go

    参考链接:https://www.cnblogs.com/w-y-f/archive/2012/05/07/2488474.html

    二、同一台服务器不同数据库

    select * from 数据库名..表名 或 select * from 数据库名.dbo.表名

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    C#创建自定义配置节
    linux下安装nginx
    linux查看防火墙状态和对外开放的端口状态
    js 获取二级域名
    .net core 获取本地ip及request请求端口
    《趣谈 Linux 操作系统》学习笔记(二):对 Linux 操作系统的理解
    《趣谈 Linux 操作系统》学习笔记(一):为什么要学 Linux 及学习路径
    Redis Cluster集群
    Redis的主从复制与Redis Sentinel哨兵机制
    Redis持久化方案
  • 原文地址:https://www.cnblogs.com/zhaoyl9/p/11527090.html
Copyright © 2011-2022 走看看