有关更新关联表遇到的问题.

       最近在做使用手机审批代办件的事情.使用的数据库为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方面的知识比较欠缺,现在只能暂时使用这种方法处理.之后有待修正.或采用更好的方法.

 

 

 


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值