0

我發現了一個新問題:我有兩個表,學生學生參考作者[ClassID]專欄。 已列名爲[計數],其存儲參考學生的數量,我通過努力更新其插入後,刪除學生觸發。 我寫了一個簡單CALC_COUNT過程那樣:通過觸發計數參考記錄


CREATE PROCEDURE [dbo].[CALC_COUNT] 
    @classid INT 
AS 
BEGIN 
UPDATE classes SET [Count] = (SELECT COUNT(Id) FROM students WHERE [ClassID] = @classid); 
END 

RETURN 0 

,並用它裏面觸發


CREATE TRIGGER [MONITOR_STUDENTS_SCHEMA_TRIGGER] 
    ON [dbo].[students] 
    AFTER DELETE, INSERT 
    AS 
    BEGIN 
     UPDATE [dbo].[classes] 
     SET studentsschemarev +=1 FROM inserted; 
     CALC_COUNT(SELECT [ClassID] FROM inserted UNION SELECT [ClassID] FROM deleted); 
     UPDATE [dbo].[stats] SET students_schema_rev += 1; 
    END 

乙它不起作用。 我想,我需要一種方法來在觸發器的SELECT語句中爲每一行執行過程,但我不知道如何。

SQL Server 2012中的LocalDB,與SQL Server兼容模式2008

回答

1

你不需要你的存儲過程。

更新您的觸發是

update classes 
set 
    count = StudentCount, 
    schemarevcount += 1 
from 
    classes 
     inner join 
    (select * from inserted union select * from deleted) students 
     on classes.classid=students.classid 
     inner join 
    (select classid, count(*) as StudentCount from students group by classid) counts 
     on students.classid = counts.classid 

到位的更新和呼叫來calc_count

英文譯本......

  • 更新類(設置修改和計數)
  • 其中班級在學生表中更改
  • 哪裏該類是集合每班
+0

謝謝,現在就試試。 – 2012-08-02 21:06:51

+0

> on classes.studentid = students.classid //否,學生有[ClassID],但班級沒有[StudentID]。交叉許多不好。 – 2012-08-02 21:16:28

+0

我的不好 - 應該是classes.classid – podiluska 2012-08-02 21:18:45

0

好學生的罪名,你的觸發器不會被觸發的主要原因,是因爲你正在做您的觸發器是在INSERT去和刪除更新。

是,更新是一種刪除和插入,但你必須把它放在你的足跡:

AFTER DELETE, INSERT, UPDATE 

,而不是

AFTER DELETE, INSERT 

接下來,在觸發本身你只有內部概念表稱爲插入和刪除,它們結合起來給你更新。舊部分位於已刪除的表中,新部分位於已插入的表中。

爲什麼要按照記錄的方式執行記錄?使用完整的結果集做得更快!