2011-04-20 181 views
0

我的名字有一個表上的觸發器:[OfficeAutomation_Letter]每行更新另一個時間 更新的表我 但是,當更新命令我跑兩行 會觸發一個錯誤 我需要解釋的過道中的每一行如何發展更新觸發問題的更新

我的觸發是:

ALTER TRIGGER [dbo].[Letter_UPD] ON [dbo].[OfficeAutomation_Letter] 
FOR UPDATE 
AS 

Declare @LetterID int 
SELECT @LetterID = ID From Inserted 

BEGIN   
    UPDATE OfficeAutomation_TempLetter 
    SET Archived = (Select Archive From Inserted), 
    OriginalNumber = (Select OriginalNumber From Inserted) 
    WHERE LetterID = @LetterID   
END 

更新我的命令是:

update OfficeAutomation_Letter set OriginalNumber=100 where ID in (3,4) 

訪問的錯誤是:

Subquery returned more than 1 value. This is not permitted when 
the subquery follows =, !=, <, <= , >, >= or when the subquery 
is used as an expression. 

回答

3

觸發器每行每聲明運行一次,不是一次,inserted和deleted表中的僞包含所有受影響的行。

ALTER TRIGGER [dbo].[Letter_UPD] ON [dbo].[OfficeAutomation_Letter] 
FOR UPDATE 
AS 
    UPDATE otl 
    SET Archived = i.Archive, 
    OriginalNumber = i.OriginalNumber 
    FROM 
     OfficeAutomation_TempLetter otl 
     inner join 
     inserted i 
     on 
      otl.LetterID = i.ID 

所以,在你原來的觸發,我們有:?

SELECT @LetterID = ID From Inserted 

這是要分配受影響的行中的一個(誰知道哪一個,的ID - 這是沒有定義

然後

SET Archived = (Select Archive From Inserted), 
OriginalNumber = (Select OriginalNumber From Inserted) 

這是實際您看到錯誤的原因,因爲右側的選擇將返回多行。

+0

謝謝 正確 – Ehsan 2011-04-20 08:44:30