MSSQL数据库A和数据库B中都有二个相同的表:POS(ID,FormDate),PODetails(ID,FormID)。其中列ID为IDentity列,FormID关联POS的ID列。现想设置一个参数@FORMDATE,把数据库A中@FormDate=FormDate的POS表及PODetails表的数据导入到数据库B中。请问如何实现(MSSQL的Replication能实现吗),谢谢!

解决方案 »

  1.   

    如果A、B库是在同一台机器中,可以直接使用以下语句
    insert into B.dbo.PODetails(FormID)
    select distinct ID from A.dbo.POS 
      where FormDate=@FormDate
      

  2.   

    SET IDENTITY_INSERT b..POS ONinsert into b..POS(id , FormDate) select id , FormDate from a..pos where FormDate = @FormDateSET IDENTITY_INSERT b..POS OFFSET IDENTITY_INSERT b..PODetails ONinsert into b..PODetails(id , formid) select m.id , m.formid from a..PODetails m,a..pos n where m.formid = n.id and n.formdate = @formdateSET IDENTITY_INSERT b..PODetails OFF
      

  3.   

    如果同机:
    SET IDENTITY_INSERT b..POS ONinsert into b..POS(id , FormDate) select id , FormDate from a..pos where FormDate = @FormDateSET IDENTITY_INSERT b..POS OFFSET IDENTITY_INSERT b..PODetails ONinsert into b..PODetails(id , formid) select m.id , m.formid from a..PODetails m,a..pos n where m.formid = n.id and n.formdate = @formdateSET IDENTITY_INSERT b..PODetails OFF
    如果不同机,先做好连接.不同服务器数据库之间的数据操作--创建链接服务器 
    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 本地表 然后加上机器名.
    --有关这几个SET语句,最好到要操作的服务器上去执行,可不写机器名.
    SET IDENTITY_INSERT machinenameb.b..POS ONinsert into machinenameb.b..POS(id , FormDate) select id , FormDate from machinenamea.a..pos where FormDate = @FormDateSET IDENTITY_INSERT machinenameb.b..POS OFFSET IDENTITY_INSERT machinenameb.b..PODetails ONinsert into machinenameb.b..PODetails(id , formid) select m.id , m.formid from machinenamea.a..PODetails m,machinenamea.a..pos n where m.formid = n.id and n.formdate = @formdateSET IDENTITY_INSERT machinenameb.b..PODetails OFF