2014-01-20 46 views
0

我知道這不是一種方法,但它是一個面試問題觸發器更新列的總和?

使用觸發器更新total = marks1 + marks2 + marks3。

我寫了類似這樣的內容,但是它並沒有在插入語句後更新。

CREATE table marks 
(
marks1 int, 
marks2 int, 
marks3 int, 
total int 
) 

SELECT * from marks m 

insert into marks values(10,10,20,0) 

drop TRIGGER total_marks 
create TRIGGER total_marks ON marks 
AFTER INSERT 
AS 
begin 
SET NOCOUNT ON 

DECLARE @marks1 as int 
select @marks1 = inserted.marks1 FROM inserted 
DECLARE @marks2 as int 
select @marks1 = inserted.marks2 FROM inserted 
DECLARE @marks3 as int 
select @marks1 = inserted.marks3 FROM inserted 
DECLARE @result as int 
set @result = @marks1 + @marks2 + @marks3 

update marks 
set total = @result 

SET NOCOUNT OFF 
end 
+0

'插入後,更新'請參閱http://stackoverflow.com/questions/7528899/after-insert-update-timestamp-trigger-with-two-column-primary-key – xQbert

+3

您的觸發器不處理多個行插入,將* all *行更新爲相同的值(而不僅僅是插入的行),並且遠遠超過必要的複雜度。你的鑰匙在哪裏? –

+0

除了其他問題,爲所有三個標記選擇「@ marks1」可能沒有幫助。至少你爲其他兩個標記聲明變量,即使它們從未初始化過。 – HABO

回答

1

您的觸發器不處理多行插入,更新所有行相同的值(而不是僅僅插入的行(S)),並且比需要的要複雜得多呢。你的鑰匙在哪裏?

CREATE TRIGGER dbo.total_marks 
ON dbo.marks 
FOR INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE m 
    SET total = i.marks1 + i.marks2 + i.marks3 
    FROM dbo.marks AS m 
    INNER JOIN inserted AS i 
    ON m.key = i.key; 
END 
GO 

如果您的表確實沒有密鑰(它沒有一大堆的道理給我),那麼你可以說這一點,但它可能更新已經更新行:

ON m.marks1 = i.marks1 AND m.marks2 = i.marks2 AND m.marks3 = i.marks3 
WHERE m.total = 0;