zoukankan      html  css  js  c++  java
  • SQL跨数据库复制表数据

    SQL跨数据库复制表数据 

    默认分类 2010-09-02 16:53:14 阅读346 评论   字号: 订阅

     

    不同服务器数据库之间的数据操作

    不同数据库之间复制表的数据的方法:

    当表目标表存在时:

    insert into 目的数据库..表 select * from 源数据库..表  

    当目标表不存在时:

    select * into 目的数据库..表 from 源数据库..表

    --如果在不同的SQL之间: 

    insert into openrowset('sqloledb','目的服务器名';'sa';'',目的数据库.dbo.表) 
    select * from 源数据库..表 

    --创建链接服务器 
    exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 
    exec sp_addlinkedsrvlogin 'ITSV ', 'false ',null, '用户名 ', '密码 ' 

    --查询示例 
    select * from ITSV.数据库名.dbo.表名 

    --导入示例 
    select * into 表 from ITSV.数据库名.dbo.表名 

    --以后不再使用时删除链接服务器 
    exec sp_dropserver 'ITSV ', 'droplogins ' 

    --连接远程/局域网数据(openrowset/openquery/opendatasource) 
    --1、openrowset 

    --查询示例 
    select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 

    --生成本地表 
    select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 

    --把本地表导入远程表 
    insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名) 
    select *from 本地表 

    --更新本地表 
    update b 
    set b.列A=a.列A 
    from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b 
    on a.column1=b.column1 

    --openquery用法需要创建一个连接 

    --首先创建一个连接创建链接服务器 
    exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 
    --查询 
    select * 
    FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') 
    --把本地表导入远程表 
    insert openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') 
    select * from 本地表 
    --更新本地表 
    update b 
    set b.列B=a.列B 
    FROM openquery(ITSV, 'SELECT * FROM 数据库.dbo.表名 ') as a 
    inner join 本地表 b on a.列A=b.列A 

    --3、opendatasource/openrowset 
    SELECT   * 
    FROM   opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta 
    --把本地表导入远程表 
    insert opendatasource( 'SQLOLEDB ', 'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名 
    select * from

    -----------------------------------------------------------------------------------------------------------------------------------

    好吧,如果上面看得烦下面有个更容易理解的例子:

    Exec sp_droplinkedsrvlogin DBVIP,Null
    Exec sp_dropserver DBVIP

    EXEC sp_addlinkedserver
          @server='DBVIP',--被访问的服务器别名 
          @srvproduct='',
          @provider='SQLOLEDB',
          @datasrc='Server2'   --要访问的服务器


    EXEC sp_addlinkedsrvlogin 
         'DBVIP', --被访问的服务器别名
         'false', 
         NULL, 
         'sa', --帐号
         'thankyoubobby' --密码


    Select   *   from DBVIP.pubs.dbo.orders   


    /////////////////////////////ORACLE////////////////////////////
    Exec sp_droplinkedsrvlogin demo,Null
    Exec sp_dropserver demo
    go

    EXEC sp_addlinkedserver 
            @server ='demo',
            @srvproduct='Oracle',
       @provider='MSDAORA', 
       @datasrc='ServiceName' 
      

    EXEC sp_addlinkedsrvlogin 
         'demo', 
         'false', 
         NULL, 
         'userid', 
         'password' 
    go

    SELECT * FROM OPENQUERY(demo ,'select * from tbdemo' )

    UPDATE OPENQUERY (demo, 'SELECT id FROM tbdemo WHERE id = 101') 
    SET name = 'hello';

    INSERT OPENQUERY (demo, 'SELECT id FROM tbdemo')
    VALUES ('hello');

    DELETE OPENQUERY (demo, 'SELECT id FROM tbdemo WHERE name = ''hello''');

    -------------------------------------------具体例子------------------------------------------------------------

    if   exists(select   1   from   master.dbo.sysservers   where   srvname   =   'test')   
    begin   
    exec   sp_droplinkedsrvlogin     'test','sa'   
    exec   sp_dropserver     'test'   
    end  

    --建立连接服务器 
    EXEC sp_addlinkedserver 'test', 'ms','SQLOLEDB', '192.168.1.99'


    exec sp_addlinkedsrvlogin 'test','false',null,'sa',''
    select * from test.db_film.dbo.T_film
    go

    if   exists(select   1   from   master.dbo.sysservers   where   srvname   =   'test')   
    begin   
    exec   sp_droplinkedsrvlogin     'test','sa'   
    exec   sp_dropserver     'test'   
    end  

    go

    sql sever跨数据库复制数据的方法

    2014-01-09 10:52 by xiashengwang, 1547 阅读, 0 评论, 收藏编辑

    1,用Opendatasource系统函数

    详细的用法已经注释在sql代码中了。这个是在sqlserver到sqlserver之间的倒数据。2005,2008,2012应该都是适用的。

    复制代码
    --从远程服务器192.168.66.154上查询100条数据,然后导入到dbo.dquestiondata中
    insert into dbo.dquestiondata
    select top 100 * from
    opendatasource('sqloledb','data source=192.168.6.154;user id=sa;password=xxxxxx').Answer.dbo.DQuestionData
    --opendatasource 是一个系统函数,第一个参数是Provider Name,第二个参数是Oledb链接字符串,
    --注意连接字符串里没有指定数据库;数据库名称,Schema,表名在opendatasource函数后面书写。
    
    --执行上面的语句会报如下的错,原因是没有开启远程查询支持
        --SQL Server blocked access to STATEMENT 'OpenRowset/OpenDatasource' of component 'Ad Hoc Distributed Queries' 
        --because this component is turned off as part of the security configuration for this server. 
        --A system administrator can enable the use of 'Ad Hoc Distributed Queries' by using sp_configure. 
        --For more information about enabling 'Ad Hoc Distributed Queries', see "Surface Area Configuration" in SQL Server Books Online.
    
    --解决办法1:在图形界面中,SQL Server 安全配置-->机能的安全配置-->开启远程查询Openrowset和opendatasource的支持
    
    --解决办法2:用sp_confing系统存储过程,以命令行的方式开启
    --首先必须开启‘show advanced options’高级选项,因为‘Ad Hoc Distributed Queries’属于高级选项
    exec sp_configure 'show advanced options' ,1
    reconfigure
    --下面这步可以省略,不带参数的sp_configure,表示查看所有可用的选项
    --记住上面一定要加reconfigure语句,目的是使选项立即生效,不然我们
    --还是看不到'Ad Hoc Distributed Queries'高级选项
    exec sp_configure
    --打开'Ad Hoc Distributed Queries'选项
    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
    --查看一下是不是关闭了
    exec sp_configure
    复制代码

     2,用openrowset系统函数

    复制代码
    --1,Microsoft OLE DB Provider for SQL Server
    --注意第二部分链接字符串的写法很是奇怪Server,user,passwrod是用“;”连接的。
    select top 100 * from
    openrowset('sqloledb','192.168.6.154';'sa';'xxxxx',Answer.dbo.DQuestionData) 
    
    --2,ODBC数据源的方式:Microsoft OLE DB Provider for ODBC Drivers
    select  top 100 * from
    openrowset('MSDASQL','DRIVER={SQL Server};SERVER=192.168.6.154;UID=sa;PWD=xxxxx',Answer.dbo.DQuestionData) 
    复制代码

     上面的两种方法都会用到oledb提供商的名称,下面的这个系统存储过程可以查看oledb提供程序的名称

    --用于查看oledb提供者名称
    EXEC master..xp_enum_oledb_providers 

    3,用链接服务器

    如果要多次用到远程查询,每次都写那么长的链接字符串有点麻烦。可以考虑重复利用。

    用链接服务器可以很好的解决这个问题

    复制代码
    -- 创建链接服务器
    exec sp_addlinkedserver 'svr_link','','sqloledb','192.168.6.154'
    -- 创建登录信息
    exec sp_addlinkedsrvlogin 'svr_link','false',null,'sa','xxxx'
    
    --查询 格式为:链接服务器.数据库名.架构名.表名
    select top 100 * from svr_link.Answer.dbo.DQuestionData
    
    -- 删除链接服务器
    exec sp_dropserver 'svr_link','droplogins'
    复制代码

    需要注意的几点:

    1,虽然上面的例子都是从远程服务器select数据到本地,

    但我们同样可以将本地的数据导向远程服务器

    -- 往远程数据库192.168.6.154的Answer数据库的test表插入两条数据
    insert into svr_link.Answer.dbo.test
    select 1,'zhang' union all
    select 2,'wang'

    2,有了链接服务器,就可以用openquery系统函数了

    复制代码
    --检索数据
    select * from 
    openquery(svr_link,'select  * from Answer.dbo.test')
    -- 插入数据
    insert into openquery(svr_link,'select  * from Answer.dbo.test')
    select 3,'li'
    复制代码

    3,opendatasource和链接服务器都是只返回Server部分,要查询表需要进一步指定数据库,架构和表名。而openrowset和openquery返回的是记录集。

  • 相关阅读:
    23种设计模式总篇
    23种设计模式之抽象工厂
    23种设计模式之原型模式
    23种设计模式之适配器模式
    23种设计模式之工厂模式
    23种设计模式之模板方法
    Cloudera Manager 5和CDH5离线安装
    ArrayList vs. LinkedList vs. Vector
    在Java中怎样把数组转换为ArrayList?
    两个有序数组的中位数 【算法】
  • 原文地址:https://www.cnblogs.com/JUSTSOSOBLOG/p/5336142.html
Copyright © 2011-2022 走看看