2016-06-16 43 views
0

我有一個存儲過程,如下提及的更新一列多行:獲取觸發插入的行ID在存儲過程

update tableA 
set isactive = 0 
where email = '' 

TableA有更新觸發器如果isactive改爲插入tableALog。 現在在我的存儲過程更新語句執行後,我需要獲得tableALog主鍵值。

我已經使用了以下方式bu不幸。

@@identity - 由於它返回上次更新的值而失敗。但我需要插入插入日誌表

OUTPUT主鍵值的列表。 - 不能使用它,因爲它總是在存儲過程中的當前作用域上工作。但我需要從觸發器插入的表值。

如果您有任何建議,請讓我知道。

+0

,如果您需要在存儲過程中更新日誌表的主鍵,那麼你應該把時間modificationdate並在此日期前爲了獲得由遞減 –

+0

不能在修改日期回覆,因爲其他一些程序也可能會更新同一列。這就是我需要在存儲過程本身中插入行的原因。 –

+0

與嘗試描述所做的相比,您可能更適合重新設計您的設計(即重新設計以消除問題)。 –

回答

1

這開始作爲一個評論,但它變得太長時間,所以存儲過程和它們激活觸發器之間...

共享數據是棘手的, 由於觸發器可以不帶參數不是他們能返回值。
根據我的經驗,實現這種事情的最好方法是在觸發器設置的表格中添加一列以標識觸發器正在處理的記錄,併爲觸發器添加一個表格(可以是臨時表格)輸出數據和存儲過程讀取。

+1

「,因爲觸發器將與存儲過程並行執行,並且存儲過程不會等到觸發器完成」 - 呃?在什麼宇宙?存儲過程中的每個單獨語句一次執行一個,並且每個語句的執行都沒有完成,直到所有活動(包括觸發任何觸發器,更新任何索引等)完成。你從哪裏抽取「觸發器和存儲過程將並行執行」? –

+0

例如如果執行'create table T(ID int) go 在T上創建觸發器TT for update as \t print'tt1'; \t waitfor delay '00:00:05'; \t print'tt2'; 去 創建步驟P 作爲 \t打印 'P1'; \t update T set ID = ID + 1; \t print'p2'; go exec P'你會得到輸出'p1','tt1','tt2','(0 row(s)affected)'和'p2'。 –

+0

@Damien_The_Unbeliever我糾正了。內存有時服務不好:-) –

相關問題