情况是这样的
源:本地,数据库名test,表名test
目的:192.168.0.5,帐户sa,密码a,数据库名zbscdb,表名zbsctb2个表的结构都一样
TagName DataValue DataTime CommentTagname是唯一的,作为更新条件2个表的Tagname集合也是一样的我现在希望用本地表的所有记录去更新目的表,最好是能只用一条语句。不能先删后插是因为如果刚删但还没插的时候去读表,会为空。

解决方案 »

  1.   

    --不同服务器数据库之间的数据操作
    --************************************************************************************
    --创建链接服务器 
    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 ' 
      

  2.   

    最好建db linksp_addlinkedserver
      

  3.   

    --不同服务器数据库之间的数据操作
    --************************************************************************************
    --创建链接服务器 
    exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '192.168.0.5' 
    exec sp_addlinkedsrvlogin  'ITSV ', 'false ',null, 'sa ', 'sa ' --先update 
    update a set a.DataValue=b.DataValue, a.DataTime=b.DataTime, a.Comment=b.Comment from ITSV.zbscdb.dbo.zbsctb a,test b
    where a.TagName=b.TagName--再insert
    insert  ITSV.zbscdb.dbo.zbsctb select * from test where  TagName not in (select TagName from ITSV.zbscdb.dbo.zbsctb)
      

  4.   

    --不同服务器数据库之间的数据操作
    --************************************************************************************
    --创建链接服务器 
    exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '192.168.0.5' 
    exec sp_addlinkedsrvlogin  'ITSV ', 'false ',null, 'sa ', 'sa ' --先update 
    update a set a.DataValue=b.DataValue, a.DataTime=b.DataTime, a.Comment=b.Comment from ITSV.zbscdb.dbo.zbsctb a,test b
    where a.TagName=b.TagName--再insert
    insert  ITSV.zbscdb.dbo.zbsctb select * from test where  TagName not in (select TagName from ITSV.zbscdb.dbo.zbsctb)
      

  5.   

    先链接输入库,如上面几位的写法.update [192.168.0.5].zbscdb.dbo.zbsctb
    set DataValue = n.DataValue
        DataTime  = n.DataTime
        Comment   = n.Comment
    from [192.168.0.5].zbscdb.dbo.zbsctb m , test n
    where m.Tagname = n.Tagname
      

  6.   

     远程连接操作_整理贴2   
    http://topic.csdn.net/u/20080612/22/bb2dfa83-1cf3-4a0b-9bd4-5a39e6193556.html
      

  7.   


    2个exec都可以执行
    在update的时候报错:
    服务器: 消息 7403,级别 16,状态 1,行 1
    未能找到 OLE DB 提供程序 'SQLOLEDB ' 的注册表项。
    OLE DB 错误跟踪[Non-interface error:  Provider not registered.]。然后我试着select * from ITSV.zbscdb.dbo.zbsctb也报同样的错但我这样:
    select * from
    OPENDATASOURCE('SQLOLEDB','Data Source=192.168.0.5;User ID=sa;Password=a).zbscdb.dbo.zbsctb 
    就没问题接着我这样:
    update OPENDATASOURCE('SQLOLEDB','Data Source=192.168.0.5;User ID=sa;Password=a).zbscdb.dbo.zbsctb aa
    set a.DataValue=10000 where a.TagName='68'
    就说aa附近语法错误
      

  8.   

    1、创建链接服务器 
    exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 ' 
    exec sp_addlinkedsrvlogin  'ITSV ', 'false ',null, '用户名 ', '密码 ' 2、启动两台服务器的MSDTC服务 
    MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。3、打开双方的135端口
    MSDTC服务依赖于RPC(Remote Procedure Call (RPC))服务,RPC使用135端口,保证RPC服务启动,如果服务器有防火墙,保证135端口不被防火墙挡住。
    使用“telnet IP 135”命令测试对方端口是否对外开放。也可用端口扫描软件(比如Advanced Port Scanner)扫描端口以判断端口是否开放
      

  9.   

    update OPENDATASOURCE('SQLOLEDB','Data Source=192.168.0.5;User ID=sa;Password=a).zbscdb.dbo.zbsctb aa 
    set aa.DataValue=10000 where aa.TagName='68'
    刚才打错了,aa附近语法错误
      

  10.   

    update OPENDATASOURCE('SQLOLEDB','Data Source=192.168.0.5;User ID=sa;Password=a').zbscdb.dbo.zbsctb aa 
    set aa.DataValue=10000 where aa.TagName='68' 
      

  11.   

    update OPENDATASOURCE('SQLOLEDB','Data Source=192.168.0.5;User ID=sa;Password=a').zbscdb.dbo.zbsctb aa 
    set aa.DataValue=10000 where aa.TagName='68' 
      

  12.   

    不行,这个语法太奇怪了
    update m
    set m.DataValue = n.DataValue,m.DataTime= n.DataTime,m.Comment= n.Comment
    from OPENDATASOURCE('SQLOLEDB','Data Source=192.168.0.5;User ID=sa;Password=a).zbscdb.dbo.zbsctb m,test n
    where m.TagName=n.TagName
    编译通过了,但执行的时候报错
    服务器: 消息 208,级别 16,状态 1,行 1
    对象名 'm' 无效。update OPENDATASOURCE('SQLOLEDB','Data Source=192.168.0.5;User ID=sa;Password=a).zbscdb.dbo.zbsctb
    set DataValue = n.DataValue,DataTime= n.DataTime,Comment= n.Comment
    from OPENDATASOURCE('SQLOLEDB','Data Source=192.168.0.5;User ID=sa;Password=a).zbscdb.dbo.zbsctb m,test n
    where m.TagName=n.TagName
    编译通过了,但执行的时候也报错
    服务器: 消息 7306,级别 16,状态 2,行 1
    未能打开表 '"zbscdb"."dbo"."zbsctb"'(来自 OLE DB 提供程序 'SQLOLEDB')。 提供程序未能支持行查找位置。 提供程序指出与其它属性或要求发生了冲突。
    OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' IOpenRowset::OpenRowset returned 0x80040e21:  [PROPID=DBPROP_BOOKMARKS VALUE=True STATUS=DBPROPSTATUS_CONFLICTING], [PROPID=Unknown PropertyID VALUE=True STATUS=DBPROPSTATUS_OK], [PROPID=DBPROP_IRowsetLocate VALUE=True STATUS=DBPROPSTATUS_CONFLICTING], [PROPID=DBPROP_IRowsetChange VALUE=True STATUS=DBPROPSTATUS_OK], [PROPID=DBPROP_UPDATABILITY VALUE=1 STA...
      

  13.   

    我又试了下
    update OPENDATASOURCE('SQLOLEDB','Data Source=192.168.0.5;User ID=sa;Password=a).zbscdb.dbo.zbsctb
    set datavalue=(select datavalue from test where tagname='61')
    where tagname='61'
    这样子就可以了,但是只能更新一条记录,而且要把tagname罗列出来不知道能不能一次批量更新
      

  14.   

    这个就是5楼的:
    update OPENDATASOURCE('SQLOLEDB','Data Source=192.168.0.5;User ID=sa;Password=a).zbscdb.dbo.zbsctb 
    set DataValue = n.DataValue,DataTime= n.DataTime,Comment= n.Comment 
    from OPENDATASOURCE('SQLOLEDB','Data Source=192.168.0.5;User ID=sa;Password=a).zbscdb.dbo.zbsctb m,test n 
    where m.TagName=n.TagName 
    编译通过了,但执行的时候也报错 
    服务器: 消息 7306,级别 16,状态 2,行 1 
    未能打开表 '"zbscdb"."dbo"."zbsctb"'(来自 OLE DB 提供程序 'SQLOLEDB')。 提供程序未能支持行查找位置。 提供程序指出与其它属性或要求发生了冲突。 
    OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' IOpenRowset::OpenRowset returned 0x80040e21:  [PROPID=DBPROP_BOOKMARKS VALUE=True STATUS=DBPROPSTATUS_CONFLICTING], [PROPID=Unknown PropertyID VALUE=True STATUS=DBPROPSTATUS_OK], [PROPID=DBPROP_IRowsetLocate VALUE=True STATUS=DBPROPSTATUS_CONFLICTING], [PROPID=DBPROP_IRowsetChange VALUE=True STATUS=DBPROPSTATUS_OK], [PROPID=DBPROP_UPDATABILITY VALUE=1 STA...