sql server 组下面有两个注册的服务器,一个是本地的,一个是另外一台机的。
我现在想比较这个两个服务器中同数据库名的某个数据表的数据。
比如:server1中有个数据库database1,下面有个表为table1,表中有字段为主键(key)、数量(number)、日期(date)
     server2中也有个数据库database1,下面有个表也为table1,表中有字段为主键(key)、数量(number)、日期两个数据库结构和字段全部一模一样,我只是想对比这两个table的数据记录有什么不同(记录数还有同一主键的数量是否一致),请问我该怎么做??(因为有一个数据库是我倒闸过来的数据)

解决方案 »

  1.   

    --遠程連接操作
    /******************************************************************************************************************************************************
    Tab表:
    /*
    ID 自增列         Name
    ----------- ---------
    1           a
    2           b
    3           c
    */
    存儲過程:
    /*
    create proc P
    as
    select top 10 ID,Name from sysobjects
    */整理人:中國風(Roy)日期:2008.06.06
    ******************************************************************************************************************************************************/--遠程鏈接服務器機器名:Roy;實例名:Roy\SQL2005DE;登陸名:sa;密碼:Test2005;--創建鏈接服務器
    EXEC master.dbo.sp_addlinkedserver @server = N'ROY_LNK', @srvproduct=N'ROY_LNK', @provider=N'SQLOLEDB', @datasrc=N'Roy\SQL2005DE'--SQL05可用SQLNCLI\SQLOLEDB
    GO
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'ROY_LNK', @locallogin = NULL , @useself = N'False', @rmtuser = N'sa', @rmtpassword = N'Test2005'
    GO--刪除鏈接服務器
    --exec sp_dropserver 'roy_lnk','droplogins'--Select
    select * from roy_lnk.test.dbo.Tab--insert
    insert roy_lnk.test.dbo.Tab(Name)--指定列
    Values('d')--update
    update roy_lnk.test.dbo.Tab set Name='DD' where Name='d'--delete 
    delete roy_lnk.test.dbo.Tab where Name='DD'用openrowset:--支持存儲過程
    select *from openrowset('SQLOLEDB','Roy\SQL2005DE';'sa';'Test2005','test.dbo.p')a
    --select 
    select *from openrowset('SQLOLEDB','Roy\SQL2005DE';'sa';'Test2005',test.dbo.Tab)a
    --insert
    insert openrowset('SQLOLEDB','Roy\SQL2005DE';'sa';'Test2005',test.dbo.Tab)(Name)values('EE')--update 
    update openrowset('SQLOLEDB','Roy\SQL2005DE';'sa';'Test2005',test.dbo.Tab) set Name='EEE' where Name=N'EE'--delete
    delete openrowset('SQLOLEDB','Roy\SQL2005DE';'sa';'Test2005',test.dbo.Tab) where Name=N'EEE'
    用openquery:--支持存儲過程--支持存儲過程
    select *  from openquery(roy_lnk, 'test.dbo.P')
    --select
    SELECT * FROM openquery(roy_lnk, 'SELECT * FROM test.dbo.tab') --insert
    insert openquery(roy_lnk, 'SELECT * FROM test.dbo.tab') (Name) values('F')--update 
    update openquery(roy_lnk, 'SELECT * FROM test.dbo.tab') set Name='FF' where Name='F'--delete不支持是根據 OLE DB 提供者的功能而定
    --delete openquery(roy_lnk, 'SELECT * FROM test.dbo.tab')  where Name='FF' 用OPENDATASOURCE:--支持存儲過程
    select *  from OPENDATASOURCE('SQLOLEDB','Data Source=Roy\SQL2005DE;User ID=sa;Password=Test2005').'test.dbo.p' --select
    select *  from OPENDATASOURCE('SQLOLEDB','Data Source=Roy\SQL2005DE;User ID=sa;Password=Test2005').test.dbo.tab --insert
    insert OPENDATASOURCE('SQLOLEDB','Data Source=Roy\SQL2005DE;User ID=sa;Password=Test2005').test.dbo.tab(Name) values('H')--update
    update OPENDATASOURCE('SQLOLEDB','Data Source=Roy\SQL2005DE;User ID=sa;Password=Test2005').test.dbo.tab set Name='HH' where Name='H'--delete 
    delete OPENDATASOURCE('SQLOLEDB','Data Source=Roy\SQL2005DE;User ID=sa;Password=Test2005').test.dbo.tab where Name='HH'
    --與本機表數據對比時用別名
    select * from roy_lnk.test.dbo.Tab a join tab b on a.ID=b.ID
      

  2.   

    先根据2楼的方法:建立链接服务器.然后就可以像操作本地的表一样,操作链接服务器上的表.访问要加链接服务器名前缀:链接服务器名.dbname.dbo.tbname
      

  3.   

    疯子还真会活学活用哇,
    风才贴出来,你就搬过来了,
    吼吼~~
    -----------------
    PS:
    一种方式,如前所说,创建Linked Server.然后查询,
    另外一种方式,如果表不多的话,
    可以导入到另外一个库的临时表中,直接在一个库中比较即可.
      

  4.   

    --server1中执行
    --看数据件数
    select count(*) from database1..table1 
    select count(*) from openrowset('sqloledb','S2IP';'S2userid';'S2psd',select * from database1..table1)
    --找不同的数据
    select * from database1..table1 t
    where exists 
    ( select 1 from opendatasource('sqloledb','data source=S2IP;user id=S2userid;password=S2psd').database1..table1) 
      where pkey=t.pkey and date=t.date and number<>t.number)
    --openrowset与opendatasource性质一样,语法不同/*
    S2IP,S2userid,S2psd把这些换了
    未测试
    如果有语法错误,请参见联机帮助
    应该没有问题
    */
      

  5.   

    如果是2005以上版本,可以使用tablediff工具比较差异,包括结构,和数据差异,详情请参考Books Online.
      

  6.   

    如果要用
    sp_addlinkedserver
    就把这个语法背下来
    set nocount on
    exec sp_addlinkedserver 'TestSrv','','SQLOLEDB','172.17.17.17'
    exec sp_addlinkedsrvlogin 'TestSrv','false',null,'test','test'
    go
    select top 10* from TestSrv.account.account.MstNew_FeeContract
    /*
    --删除连接的服务器
    exec sp_dropserver 'TestSrv','droplogins'
    */
    set nocount off
      

  7.   

    sp_addlinkedserver或openrowset之类语句。
    参见分布式查询