情况是这样的
源:本地,数据库名test,表名test
目的:192.168.0.5,帐户sa,密码a,数据库名zbscdb,表名zbsctb2个表的结构都一样
TagName DataValue DataTime CommentTagname是唯一的,作为更新条件2个表的Tagname集合也是一样的我现在希望用本地表的所有记录去更新目的表,最好是能只用一条语句。不能先删后插是因为如果刚删但还没插的时候去读表,会为空。
源:本地,数据库名test,表名test
目的:192.168.0.5,帐户sa,密码a,数据库名zbscdb,表名zbsctb2个表的结构都一样
TagName DataValue DataTime CommentTagname是唯一的,作为更新条件2个表的Tagname集合也是一样的我现在希望用本地表的所有记录去更新目的表,最好是能只用一条语句。不能先删后插是因为如果刚删但还没插的时候去读表,会为空。
--************************************************************************************
--创建链接服务器
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 '
--************************************************************************************
--创建链接服务器
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)
--************************************************************************************
--创建链接服务器
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)
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
http://topic.csdn.net/u/20080612/22/bb2dfa83-1cf3-4a0b-9bd4-5a39e6193556.html
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附近语法错误
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)扫描端口以判断端口是否开放
set aa.DataValue=10000 where aa.TagName='68'
刚才打错了,aa附近语法错误
set aa.DataValue=10000 where aa.TagName='68'
set aa.DataValue=10000 where aa.TagName='68'
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...
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罗列出来不知道能不能一次批量更新
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...