天天看點

批量更新的觸發器問題

原文連結:http://blog.csdn.net/baronyang/article/details/5174734

原來update觸發器隻會被update觸發一次,無論更新的記錄數是多少,以下為驗證代碼

[php] view plaincopy

  1. CREATE TABLE TMP_TABLE1 (PersonCode VARCHAR(20) NOT NULL PRIMARY KEY,[NAME] VARCHAR(50) NULL,DepCode VARCHAR(20) NULL,Amount MONEY null)  
  2. CREATE TABLE TMP_TABLE2 (PersonCode VARCHAR(20) NOT NULL PRIMARY KEY,[NAME] VARCHAR(50) NULL,DepCode VARCHAR(20) NULL,Amount MONEY null)  
  3. GO  
  4. INSERT INTO TMP_TABLE1(PersonCode,[NAME],Amount)  
  5. VALUES('00001','AAA1',1000)  
  6. VALUES('00002','AAA2',1000)  
  7. VALUES('00003','AAA3',1000)  
  8. VALUES('00004','AAA4',1000)  
  9. VALUES('00005','AAA5',1000)  
  10. INSERT INTO TMP_TABLE2(PersonCode,[NAME],Amount)  
  11. Alter TRIGGER dbo.tmp_table1_update ON tmp_table1  
  12. AFTER UPDATE  
  13. AS  
  14. SELECT * INTO #INS FROM INSERTED  
  15. DECLARE @PersonCode VARCHAR(20),@Amount MONEY  
  16. IF UPDATE(Amount)  
  17. BEGIN  
  18.   SELECT @personcode=personcode,@Amount=Amount FROM #INS  
  19.   UPDATE TMP_TABLE2 SET Amount =@Amount WHERE PersonCode=@PersonCode      
  20. END  
  21. UPDATE TMP_TABLE1 SET Amount = 2000  
  22. select * from TMP_TABLE1  
  23. SELECT * FROM TMP_TABLE2  

然後再更新,發現TMP_TABLE1的Amount字段值都更新為2000,但TMP_TABLE2的Amount值隻有第一條記錄更新了,下面改一下觸發器

  1.     DECLARE AmountCursor CURSOR FOR  
  2.     SELECT personcode,Amount FROM #INS  
  3.     OPEN AmountCursor  
  4.     FETCH NEXT FROM AmountCursor INTO @PersonCode,@Amount  
  5.     WHILE @@FETCH_STATUS=0--0為Fetch語句已成功,-1為Fetch語句失敗或不在結果集中,-2提取的行不存在
  6.     BEGIN  
  7.         UPDATE TMP_TABLE2 SET Amount =@Amount WHERE PersonCode=@PersonCode  
  8.         FETCH NEXT FROM AmountCursor INTO @PersonCode,@Amount  
  9.     END  
  10.     CLOSE AmountCursor  
  11.     DEALLOCATE AmountCursor           

繼續閱讀