问题是这样的:我有两台服务器,ServA和ServB,这两台服务器中都安装有Sqlserver2000,Sqlserver2000都有同样名称的数据库CommData,CommData数据库中有数据表CommTable。  ServB中的数据库会经常进行一些更新,我想做的是:不定期从ServB中CommTable中检查有不存在于ServA中CommTable表中的记录出来,然后将之插入到ServA中的CommTable表中。   请问这样该怎样实现啊。
  

解决方案 »

  1.   

    直接在ServB中的CommTable表里面加一个字段好了,作一个标志,新的记录置成1,同步后置成0
    这样省得两台服务器之间去比较
      

  2.   

    谢谢这么快就有回复。我是想通过SQL语句来实现。  我现在是这样的:在Form上放置了两个Adoconnection,ConnA和ConnB,分别连接到ServA和ServB上的CommData数据库中。另外,还放置了两个AdoQuery组件QueryA和QeryB,准备用来进行操作。
      下面的是我想表达的是从ServA中的CommData数据库中的CommTable表中检索出不在ServB中的CommData数据库中的CommTable表的记录出来。
      Select * from ServA.CommData.CommTable  where 条件1 and  recordid not id (select recordid from ServB.CommData.CommTable     上面的语句是我想写的SQL语句,但是我不清楚该怎样写出完整、正确的SQL语句出来。
         
       
      

  3.   


    首先在ServA上添加一个指向ServB的链接服务器(关于sql server 的链接服务器怎么设置请另外搜索资料)
    加入你建立的链接服务器的名称是ServB_link那么你在ServA上执行如下的语句就可以了insert into CommTable
    Select * from ServB_link.CommData.CommTable 
    where 条件1 and  recordid not id (select recordid from CommTable )
      

  4.   

    谁帮我看看下面的问题http://topic.csdn.net/u/20090203/14/2e015517-e313-4937-913f-8d6706e29aef.html
      

  5.   

        应该说,我做的有点象一个公文包模式的程序,这个程序是别人已经开发好了的。
        
        这是一个在局域网运行的C/S程序,但后面增加了需求,要把程序离线到笔记本带来外面使用,他们的做法是,在笔记本上安装了Sqlserver数据库,每次使用时,将服务器ServA上的数据库CommData内容备份还原到笔记本中的数据库服务器中。使用完后再将笔记本中更新的数据添加到ServA中的CommData数据库中。
      但是他们的做法非常麻烦,首先将笔记本数据库的内容备份后拷贝到ServA上,然后再在ServA中新建一个临时数据库TempCommData,将备份内容还原到TempCommData中,最后才是写的一段小程序将TempCommData中的更新检索出来添加到ServA中的CommData数据库中。
      我认为这样非常麻烦,因为备份出来的数据库内容有点大,有好几个G的内容,这样倒入倒入太费时间了,我术想直接将笔记本接入交换机上,在笔记本上写这样的一段小程序,直接将笔记本更新过的内容检索出来后添加到ServA中的CommData数据库中去。    因此这样就出现了不会写下面这种SQL语句的情况:
        Select * from ServA.CommData.CommTable  where 条件1 and  recordid not id (select recordid from ServB.CommData.CommTable )     我想请问的是这种SQL语句该怎样写?????
      

  6.   

      刚才要在网上到处查看,发现一个函数:OPENDATASOURCE,不知道使用这个函数能不能实现我的要求,比如上面上面的SQL语句可以改成这样:   QueryA.sql:
       Select * from CommTable where 条件1 and recordid not in (select recordid from OPENDATASOURCE('sqloledb','data   source=ServB;user id=SA;password=12345').CommData.dbo.CommTable   以上就可以从笔记本数据库中检索出不在服务器ServA中数据库的记录来????
      

  7.   


    //user sql link (sql insert\update\delete...)
    select * from openquery(svr_iqcjl,'select * from mdr')
    /****** Object:  LinkedServer [svr_iqcjl]    Script Date: 02/05/2009 20:58:35 ******/
    EXEC master.dbo.sp_addlinkedserver @server = N'svr_iqcjl', @provider=N'SQLOLEDB', @datasrc=N'172.20.100.12'
     /* For security reasons the linked server remote logins password is changed with ######## */
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'svr_iqcjl',@useself=N'False',@locallogin=NULL,@rmtuser=N'IQC',@rmtpassword='########'GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'collation compatible', @optvalue=N'false'
    GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'data access', @optvalue=N'true'
    GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'dist', @optvalue=N'false'
    GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'pub', @optvalue=N'false'
    GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'rpc', @optvalue=N'false'
    GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'rpc out', @optvalue=N'false'
    GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'sub', @optvalue=N'false'
    GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'connect timeout', @optvalue=N'0'
    GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'collation name', @optvalue=null
    GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'lazy schema validation', @optvalue=N'false'
    GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'query timeout', @optvalue=N'0'
    GOEXEC master.dbo.sp_serveroption @server=N'svr_iqcjl', @optname=N'use remote collation', @optvalue=N'true'
    GO
      

  8.   

    http://topic.csdn.net/u/20080523/11/08E4624A-13D1-4A6C-A9BC-7CFDD721A351.html
      

  9.   

    我遇到的问题和你有点类似,我的需求是随时更新数据库中的数据,也是打算用SQL语句来实现,但是比你要简单点,只需要将要更新的数据源和现在的数据库里面的数据进行对比!!如果存在,那么不进行处理;如果不存在,那么进行插入;
    我也被SQL语句困惑了,不知道两个表中的数据对比应该怎么写!~
      

  10.   

    我决定使用OpenDataSource函数来实现我的这个要求,下面是我生成的Sql语句:Insert Into OpenDataSource('Sqloledb','data source=10.225.254.1;user id=sa;password=pzh165').CMSDB.dbo.chargetable  (select * from dbo.chargetable  where chargedate>='2009-2-9' and recordid not in (select recordid from OpenDataSource('SqlOleDb','data source=10.225.254.1;user id=sa;password=pzh165').CMSDB.dbo.chargetable   ))
       
       10.225.254.1:远程计算机的IP地址。
      

  11.   


      刚才认真去看了这个链接提供的资料,收获不小,这也证明我上面的方法是可行的。
      下面干脆我将这个资料全部拷贝过来让大家看看。不同服务器数据库之间的数据操作--创建链接服务器 
    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
      

  12.   

    1,如果非要用程序写SQL语句实现可以用链接服务器。
    2,其实你的问题就是两台服务器的数据同步问题,只要在一个服务器上创建一个包,然后建一个作业定时去调度。非常的方便,好用。这种方法是数据库数据同步的常规、合理做法。