2013-11-26 63 views
0

我有更新語句和AFTER更新觸發器。更新語句發生在一個循環中,當我沒有使用集合函數或選擇觸發器,然後觸發器正常工作時,我把聚合函數或選擇然後是取最後一個插入的值,並更新所有匹配給定條件的行SQL循環更新和更新後觸發與聚合函數

ALTER TRIGGER UpdateGrossPay 
ON DailyClocking 
AFTER UPDATE 
AS 
UPDATE Daily 
SET GrossPay=(SELECT PayRate FROM inserted WHERE 
Daily.ClockDate=inserted.ClockDate) 

GO 

我需要的select語句,因爲我不得不使用聚合函數就可以了 這功能是

SET GrossPay=((SELECT (sum(datediff(minute, 0,inserted.TotalHours)))/60.0 
FROM inserted WHERE Daily.ClockDate=inserted.ClockDate)*(SELECT PayRate from inserted)) 

幫我做到這一點。對不起,我是新來觸發

編輯

ALTER TRIGGER UpdateGrossPay ON DailyClocking AFTER UPDATE AS DECLARE @rs int; SET @rs=10

UPDATE DailyClocking SET [email protected]*PayRate GO

這不需要更新的條件。什麼都更新的行則觸發器將更新同一行與該行PayRate此觸發工作正常

EDIT 2

ALTER TRIGGER GrossPay ON Daily AFTER UPDATE AS

UPDATE Daily SET GrossPay=(datediff(minute, 0, Daily.TotalHours)/60.0)*Daily.PayRate FROM Daily,inserted WHERE Daily.ClockDate=inserted.ClockDate AND Daily.HId=inserted.HlId AND Daily.RId=inserted.RId

+1

'... pdating所有匹配給定condition'哪裏是你的條件的行?你的觸發器將更新你的表中的所有行。 –

+0

實際上它應該更新所有的行,但它應該採取相同的行值沒有最後插入 – aas

+0

不,不應該。觸發更新所有表格「插入」的計數時間。 –

回答

2

如果更新幾個記錄您的觸發條件會在「插入」表格幾行,所以你必須用插入DailyClocking加入您的DAYLY表。 在觸發器總是假設你將有幾個記錄插入和刪除。 例如(也許你應該增加僱員的id什麼的準確聯接)

UPDATE Daily 
SET GrossPay= (datediff(minute, 0,inserted.TotalHours)/60.0) * PayRate 
FROM Daily 
INNER JOIN INSERTED on Daily.ClockDate=inserted.ClockDate 
and Daily.someId = inserted.SomeId -- perhaps add some id here ? (employee or other) 
+0

正確。觸發每個SQL語句的FIRE,而不是每個ROW。 – Shiva

+0

有一個錯誤提示:Msg 157,Level 15,State 1,Procedure GrossPay,Line 10 聚合可能不會出現在UPDATE語句的集合列表中。' – aas

+0

是的,我剛剛粘貼了你的代碼,當然還有sum(),你不得不添加一個group,但因爲它已經是TotalHour了,所以我認爲它不是必需的,你可以刪除它。我糾正我的回答 – ARA