当前位置: 代码迷 >> Sql Server >> 昨天的有关问题.更新错误
  详细解决方案

昨天的有关问题.更新错误

热度:73   发布时间:2016-04-27 16:21:33.0
昨天的问题.更新异常
update   web_user_doorguest   set   current_datetime=factdatetime,lev=lev+1,   [force]=[force]+case   when   @rand <60   then   1   else   case   when   @rand <85   and   @rand> 60   then   2   else   3   end   end
,[recovery]=[recovery]+case   when   @rand1 <50   then   0   else   1   end   ,
  [agility]=[agility]+case   when   @rand2 <50   then   0   else   1   end  
,[mind]=[mind]+case   when   @rand3 <50   then   0   else   1   end   ,
  [life]=[life]+case   when   @rand4 <50   then   50   else   case   when   @rand <85   and   @rand> 50   then   52   else   55   end   end   where   [id][email protected]


发现case   when   语句,有时会出现问题,就是有的会不执行.
例如force列肯定会加一个数,但有时就不加..是放在服务器上执行.


另外..
update   web_user_doorguest   set   web_user_doorguest.current_life=(case   when   arm_count> 0   then   b.current_life   else   0   end),web_user_doorguest.state=(case   when     arm_count> 0   then   1   else   5   end)
from   #war_temp   b   where   web_user_doorguest.id=b.id   and   b.type_id=20  

还会出现current_life=0,但是state=1的情况.


------解决方案--------------------
update web_user_doorguest set current_datetime=factdatetime,lev=lev+1, [force]=[force]+case when @rand <60 then 1 else case when @rand <85 and @rand> 60 then 2 else 3 end end
,[recovery]=[recovery]+case when @rand1 <50 then 0 else 1 end ,
[agility]=[agility]+case when @rand2 <50 then 0 else 1 end
,[mind]=[mind]+case when @rand3 <50 then 0 else 1 end ,
[life]=[life]+case when @rand4 <50 then 50 else case when @rand <85 and @rand> 50 then 52 else 55 end end where [id][email protected]


发现case when 语句,有时会出现问题,就是有的会不执行.
---------------
看語句應該不會。

因為你的都有else的,不會出現沒有更新的情況。
------解决方案--------------------
1 是不是整个语句执行失败了,应该不是case when的问题
2 是不是没有临时表对应的id,或者临时表的type_id <> 20 当然不更新


------解决方案--------------------
语句上没问题,先看看服务器端SQL打补丁的情况吧,有时候不打补丁出现的问题千奇百怪。
------解决方案--------------------
Microsoft SQL Server 系统版本信息查询语句

  Select @@Version;
  然后按执行;
  这时会返回SQL的版本信息,如下:
  Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 3)
  其中的8.00.760就是SQL Server的版本和补丁号。对应关系如下:
  8.00.194 -SQL Server 2000 RTM
  8.00.384 -(SP1)
  8.00.534 -(SP2)
  8.00.760 -(SP3)
8.00.2039-(SP4)

------解决方案--------------------
1.使用 select @@VERSION
以下是我机器上的SP4版本信息
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86)
May 3 2005 23:18:38
Copyright (c) 1988-2003 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 1)

2.使用exec master..xp_msver
------解决方案--------------------
和版本 sp都没关系

理解问题,
current_life=(case when arm_count> 0 then b.current_life else 0 end)
的结果 current_life=0有两种可能
1 arm_count> 0 and b.current_life=0
  相关解决方案