最近在做使用手机审批代办件的事情.使用的数据库为sql server 2000,其中涉及到手机数据库和原有知识管理系统的数据库之间的交互.其中手机数据库中有一张表moa_request 简称A表 ,知识管理库中有张视图mobile_request 简称B表. 其中 A表中有两个字段和B表中的两个字段是相对应的.a1,b1 ; a2,b2.
然后如果B表的a2,b2和A表中的a1,b1相同,则更新A表中的status的值为0.刚开始使用语句:
update a set a.checkresult=100
from [mobileOS].[mobileOS].[dbo].[moa_request] a
where exists (select b.requestid from mobile_request b where b.requestid=a.flowid and b.userid=a.userid )
报出错误为:
服务器: 消息 7306,级别 16,状态 2,行 1
未能打开表 '"mobileOS"."dbo"."moa_request"'(来自 OLE DB 提供程序 'SQLOLEDB')。 提供程序未能支持行查找位置。 提供程序指出与其它属性或要求发生了冲突。
[OLE/DB provider returned message: 多步 OLE DB 操作产生错误。如果可能,请检查每个 OLE DB 状态值。没有工作被完成。]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' IOpenRowset::OpenRowset returned 0x80040e21: [PROPID=DBPROP_BOOKMARKS VALUE=True STATUS=DBPROPSTATUS_CONFLICTING], [PROPID=DBPROP_COMMANDTIMEOUT VALUE=600 STATUS=DBPROPSTATUS_OK], [PROPID=Unknown PropertyID VALUE=True STATUS=DBPROPSTATUS_OK], [PROPID=DBPROP_IRowsetLocate VALUE=True STATUS=DBPROPSTATUS_CONFLICTING], [PROPID=DBPROP_IRowsetChange VALUE=True...
根据查找网上的资料,说是视图没有唯一的索引或者主键.但SQL的视图是不能设置主键的.于是换了中方式,使用临时表的方法:
select * into #mobile_request2 from mobile_request
alter table #mobile_request2 add primary key (kmsuserid,requestid)
update a set a.checkresult=100 from [mobileOS].[mobileOS].[dbo].[moa_request] a
where exists (select b.requestid from #mobile_request2 b where b.requestid=a.flowid and b.userid=a.userid )
报错和之前相同,考虑可能是SQL语句错误,修改为:
update a set a.checkresult=100, status=0
from [mobileOS].[mobileOS].[dbo].[moa_request] a,#mobile_request2 b
where b.requestid = a.flowid and b.kmsuserid= a.kmsuserid
居然可以运行成功.自己现在还没弄清楚怎么回事.后考虑到这些每10分钟运行一次,使用临时表处理,会比较不妥.因此建立了一个中间表来处理.
a.将取得的代办件插入中间表 mobile_allrequests
insert into mobile_allrequests (kmsuserid,userID,requestid,requestname,lastname,reqtime,checkResult,remark,checktime,status,feedback,note,summary,comefrom ) (select * from mobile_request )
b.更新手机数据库中具有相同flowid 和kmsuserid的记录
update a set a.checkresult=100, status=0
from [mobileOS].[mobileOS].[dbo].[moa_request] a, mobile_allrequests b
where b.requestid = a.flowid and b.kmsuserid= a.kmsuserid
c.将中间表中的记录删除
delete from mobile_allrequests
由于自己对sql方面的知识比较欠缺,现在只能暂时使用这种方法处理.之后有待修正.或采用更好的方法.