2017-02-28 116 views
0

我試圖在名爲"Candidate_Personal_Info_Table"的另一個表中更新記錄時,將數據插入名爲"Candidate_Post_Info_Table_ChangeLogs"的表中。我的代碼工作正常,無論何時單個記錄更新,但當我嘗試更新多行時,它給出了錯誤:多行更新觸發器

「子查詢返回多個1值」。

以下是我的代碼:

ALTER TRIGGER [dbo].[Candidate_PostInfo_UPDATE] 
    ON [dbo].[Candidate_Post_Info_Table] 
AFTER UPDATE 
AS 
BEGIN 
    IF @@ROWCOUNT = 0 
    RETURN 

     DECLARE @Candidate_Post_ID int 
     DECLARE @Candidate_ID varchar(50) 
     DECLARE @Action VARCHAR(50) 
     DECLARE @OldValue VARCHAR(MAX) 
     DECLARE @NewValue VARCHAR(MAX) 
     DECLARE @Admin_id int 

     IF UPDATE(Verified) 
     BEGIN 
      SET @Action = 'Changed Verification Status' 
      SET @Candidate_Post_ID = (Select ID From inserted) 
      SET @Candidate_ID = (Select Identity_Number from inserted) 
       SET @NewValue = (Select Verified From inserted) 
       SET @OldValue = (Select Verified From deleted) 
       IF(@NewValue != @OldValue) 
       BEGIN 
       INSERT INTO Candidate_Post_Info_Table_ChangeLogs(Candidate_Post_ID, Candidate_ID, Change_DateTime, action, NewValue, OldValue, Admin_ID) 
       VALUES(@Candidate_Post_ID, @Candidate_ID, GETDATE(), @Action, @NewValue, @OldValue, '1') 
       END 
     END 

END 

我已經搜索堆棧溢出了這個問題,但無法得到具體到這種情況下任何相關的答案。

+0

*真的*如果您在堆棧溢出搜索與觸發的問題和SQL Server中,我」? d猜測他們中有一半人會討論這樣的事實,即你需要將'inserted'和'deleted'作爲表格*,因爲它們可以包含多行。 –

+0

你至少有4個錯誤。如果你插入多行INSERTED表有多於一行,所以你不能寫:SET @Candidate_Post_ID =(從插入的ID中選擇ID) –

回答

0

當您向表中插入/更新多個行時,系統使用的臨時表將包含插入或更新的所有行中的所有值。

因此,如果你做一個更新到6行中,Inserted表也將有6行,做這樣的事情:

SET @Candidate_Post_ID = (Select ID From inserted) 

會返回一個錯誤,只是一樣這樣做:

SET @Candidate_Post_ID = (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) 

從外觀看,你試圖用迭代的方法做到這一點。基於集合更好。也許考慮做這樣在你TRIGGER的身體(沒有所有的參數...):

IF UPDATE(Verified) 
BEGIN 
    INSERT INTO Candidate_Post_Info_Table_ChangeLogs 
    (
     Candidate_Post_ID 
     ,Candidate_ID 
     ,Change_DateTime 
     ,action 
     ,NewValue 
     ,OldValue 
     ,Admin_ID 
    ) 
    SELECT 
     I.ID 
     ,I.Identity_Number 
     ,GETDATE() 
     ,'Changed Verification Status' 
     ,I.Verified 
     ,O.Verified 
     ,'1' 
    FROM Inserted I 
    INNER JOIN Deleted O 
     ON I.ID = O.ID -- Check this condition to make sure it's a unique join per row 
    WHERE I.Verified <> O.Verified 
END 
+0

非常感謝你,先生。我很困惑如何在這種情況下使用連接。它解決了我的問題。 :) –

+0

你非常歡迎。很高興提供幫助。 – 3BK