表有触发器时dw.update报错Row changed between retrieve and update.

zjl8008 2014-06-12 10:51:57
启用触发器 更新就出错Row changed between retrieve and update.
禁用就好了,有什么解决办法吗??
补充一下,经测试发现取消触发器的 IF UPDATE(xm) OR UPDATE(xb) OR UPDATE(nl) OR UPDATE(nldw) 行就好了,这行写的不对吗?

--dw的更新时语句为
UPDATE zybrzl SET sflx = 1, nl = '25', rybq = '1', rq = '2014-06-12 10:36:27.703', cyks = '11' WHERE zyid = 5569

--触发器代码
ALTER TRIGGER [dbo].[Tri_zybrzl_update_lis]
ON [dbo].[zybrzl]
for UPDATE
AS
IF UPDATE(xm) OR UPDATE(xb) OR UPDATE(nl) OR UPDATE(nldw)
BEGIN
return
UPDATE t1
SET V_BRXM=i.XM,v_xb= (case rtrim(ltrim(i.xb)) when '1' then '男' when '2' then '女' else null end),v_nl=i.nl,V_NLLX=i.nldw
FROM
V_LIS_ZYSFXX v ,his_lis.dbo.tb_brsfxxb t1,INSERTED i
WHERE v.V_Lsh=t1.V_LSH
AND t1.D_SFSJ>DATEADD(dd,-7,GETDATE())
AND i.blh=v.V_LSH
AND t1.I_BRLBDM=1

UPDATE t1
SET V_BRXM=i.XM,v_xb= (case rtrim(ltrim(i.xb)) when '1' then '男' when '2' then '女' else null end),v_nl=i.nl,V_NLLX=i.nldw
FROM
V_LIS_ZYSFXX v ,his_lis.dbo.TB_BRSFXXB_JYSQ t1,INSERTED i
WHERE v.V_Lsh=t1.V_LSH
AND t1.D_SFSJ>DATEADD(dd,-7,GETDATE())
AND i.blh=v.V_LSH
AND t1.I_BRLBDM=1

END

...全文
166 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjl8008 2014-06-14
  • 打赏
  • 举报
回复
SET NOCOUNT ON; 解决了!!
WorldMobile 2014-06-12
  • 打赏
  • 举报
回复
试试加个FOR EACH ROW
A啦Dbit 2014-06-12
  • 打赏
  • 举报
回复
//IF UPDATE(xm) OR UPDATE(xb) OR UPDATE(nl) OR UPDATE(nldw) 这会导致sqlca.sqlnrows=0 所以update会报那个错误 可以强制更新一行数据来试试
WorldMobile 2014-06-12
  • 打赏
  • 举报
回复
引用 楼主 zjl8008 的回复:
启用触发器 更新就出错Row changed between retrieve and update. 禁用就好了,有什么解决办法吗?? 补充一下,经测试发现取消触发器的 IF UPDATE(xm) OR UPDATE(xb) OR UPDATE(nl) OR UPDATE(nldw) 行就好了,这行写的不对吗?

--dw的更新时语句为
UPDATE zybrzl SET sflx = 1, nl = '25', rybq = '1', rq = '2014-06-12 10:36:27.703', cyks = '11' WHERE zyid = 5569 

--触发器代码
ALTER TRIGGER [dbo].[Tri_zybrzl_update_lis]
   ON  [dbo].[zybrzl] 
   for UPDATE
AS 
IF UPDATE(xm) OR UPDATE(xb) OR UPDATE(nl) OR UPDATE(nldw)
BEGIN
return
UPDATE t1 
SET V_BRXM=i.XM,v_xb= (case rtrim(ltrim(i.xb)) when '1' then '男' when '2' then '女' else null end),v_nl=i.nl,V_NLLX=i.nldw
FROM 
V_LIS_ZYSFXX v ,his_lis.dbo.tb_brsfxxb t1,INSERTED i
WHERE v.V_Lsh=t1.V_LSH
AND t1.D_SFSJ>DATEADD(dd,-7,GETDATE())
AND i.blh=v.V_LSH
AND t1.I_BRLBDM=1

UPDATE t1 
SET V_BRXM=i.XM,v_xb= (case rtrim(ltrim(i.xb)) when '1' then '男' when '2' then '女' else null end),v_nl=i.nl,V_NLLX=i.nldw
FROM 
V_LIS_ZYSFXX v ,his_lis.dbo.TB_BRSFXXB_JYSQ t1,INSERTED i
WHERE v.V_Lsh=t1.V_LSH
AND t1.D_SFSJ>DATEADD(dd,-7,GETDATE())
AND i.blh=v.V_LSH
AND t1.I_BRLBDM=1

END

应该是那句话导致了影响的行数为0引起的,加上一句 SET NOCOUNT ON; 应该可以解决
zhangyangziwo 2014-06-12
  • 打赏
  • 举报
回复
在触发器中写上 set nocount on 就行啦 这是我遇到问题是发的帖子 http://bbs.csdn.net/topics/390562410

1,075

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧