我一直在試圖避免在這種特殊情況下使用遊標,只是因爲我不喜歡權衡,而且它恰好發生了,我正在使用的一個過程使觸發器看起來像正確的行動方式。在INSERT INTO Table(etc)SELECT * FROM Table2期間,如何獲取觸發器以觸發每個插入的行?
存儲過程插入基於複雜子句組合的記錄,使用插入觸發器向目標用戶發送電子郵件,告訴他們訪問站點。這很簡單,而且工作正常。
但是,另一個過程是夜間運行並重新分配所有未查看的記錄。我這樣做的方式是根據從指定日期字段的選擇開始執行另一次插入。即:
INSERT INTO Table (ID, User, AssignDate, LastActionDate)
SELECT
ID
,User
,GETDATE() [AssignDate]
,GETDATE() [LastModifiedDate]
FROM Table2
/*snip*/
該觸發器對單個插入有效,但上面的select語句僅對最後一個插入行起作用。有沒有辦法解決這個問題?它毀了整個事情!
編輯(觸發代碼):
ALTER TRIGGER dbo.Notify
ON dbo.Table
AFTER INSERT
AS
BEGIN
DECLARE @EmailSender varchar(50)='Sender Profile'
DECLARE @Identity int
DECLARE @User varchar(20)
DECLARE @Subject varchar(50)
SET @[email protected]@Identity
SELECT @User=User, @Subject='(' + CONVERT(varchar,@Identity) + ')!'
FROM Table
WHERE
[email protected]
exec msdb.dbo.sp_send_dbmail
@[email protected],
@[email protected]
@[email protected],
@body='//etc'
END
SQL Server中的觸發器每個語句觸發一次,而不是每行觸發一次。因此,您需要編寫觸發器代碼來處理存在於「插入」和/或「刪除」中的多行。通常,這仍然可以在不使用遊標的情況下完成。但是我們需要看到更多的代碼才能提供建議 - 目前所展示的只是一個標準的插入語句。 – 2011-04-27 14:52:38
已添加到觸發器代碼中。 – 2011-04-27 15:04:41
我想你會需要一個遊標。我認爲沒有任何東西允許您一次插入多個電子郵件。 – 2011-04-27 15:09:51