A问题:有两个服务器一和服务器二,服务器一中的数据库D1,其中有一表为T1,服务器二的数据库为D2,其中有一表为T2,T1和T2的结构一样,现在想将服务器一中的T1表的数据插入到服务器二中的T2表中,请问在SQL管理中的作业中的Transact-SQL语句如何编写?
备注:如服务器一的信息:IP:1.x.x.x,用户名:a密码:123  服务器二的信息:IP:2.x.x.x,用户名:b密码:456
B问题:如果是同一服务器中的两个不同数据库表又如何编写呢?
备注:数据库D1,表为T1,数据库D2,表为T2
说明:两个数据库的结构都如上图所示,其中表T1是用户每天登录系统的登录日志,现在想从表T1中抓取每个用户每天最早登录的哪一条记录插入到空表T2中。

解决方案 »

  1.   

    1.同一服务器中的两个不同数据库表,直接插入.insert into [1.x.x.x].dbname.dbo.tbname select * from [2.x.x.x].dbname.dbo.tbname.2.不同服务器参考如下:
    不同服务器数据库之间的数据操作--创建链接服务器 
    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 本地表 
      

  2.   


    A问题:
    --创建链接服务器 IP1
    exec sp_addlinkedserver 'ITSV1' , '' , 'SQLOLEDB' , 'IP1' 
    exec sp_addlinkedsrvlogin 'ITSV1' , 'false' , null , 'a' , '123'--创建链接服务器 IP2
    exec sp_addlinkedserver 'ITSV2' , '' , 'SQLOLEDB' , 'IP2' 
    exec sp_addlinkedsrvlogin 'ITSV2' , 'false' , null , 'b' , '456'insert into ITSV2.D2.dbo.T2
    select * from ITSV1.D1.dbo.T1
    B问题:insert into D2.dbo.T2
    select * from T1         --这时候你选择的数据库是T1,或者直接D1.dbo.T1-- 获取最早记录应该很容易吧!
    -- 不知正确不!
      

  3.   

    这东西用SSIS来做简直是简单极了,建议你看看SSIS方面的书。
      

  4.   

    不行,请看说明:
    说明:两个数据库的结构都如上图所示,其中表T1是用户每天登录系统的登录日志,现在想从表T1中抓取每个用户每天最早登录的哪一条记录插入到空表T2中。请帮忙写出在同一服务器中的两个不同数据库的SQL语句
      

  5.   


    select * into [D2].dbo.[T2] from [D1].dbo.[T1]
      

  6.   


    select t.* into [D2].dbo.[T2]
    from [D1].dbo.[T1] t,
        (select userid,min(oper_datetime)oper_datetime
         from [D1].dbo.[T1] e
         group by userid,convert(varchar(8),oper_datetime,112))h
    where t.userid = h.userid and t.oper_datetime = h.oper_datetime
    order by t.userid