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

表有触发器时dw.update报错Row changed between retrieve and update.
本帖最后由 zjl8008 于 2014-06-12 10:57:24 编辑
启用触发器 更新就出错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


------解决方案--------------------
//IF UPDATE(xm) OR UPDATE(xb) OR UPDATE(nl) OR UPDATE(nldw) 
这会导致sqlca.sqlnrows=0 所以update会报那个错误
可以强制更新一行数据来试试
------解决方案--------------------
试试加个FOR EACH ROW
------解决方案--------------------
在触发器中写上 set nocount on  就行啦
这是我遇到问题是发的帖子
http://bbs.csdn.net/topics/390562410

------解决方案--------------------
引用:
启用触发器 更新就出错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;

应该可以解决