2011-05-31 142 views
1

我是新來的SQL Server更新觸發器在SQL Server 2008

我要創建一個觸發更新

CREATE TRIGGER on_update 
ON [GP].[dbo].[TABLE1] 
AFTER UPDATE 
AS 

DECLARE @PKCOL1 int 
DECLARE @COL2 int 
DECLARE @COL3 nvarchar(36) 
DECLARE @COL4 nvarchar(36) 
DECLARE @COL5 nvarchar(126) 
DECLARE @COL6 datetime 
DECLARE @COL7 datetime 

BEGIN 
SELECT  @PKCOL1  = [COL-A], 
     @COL2  = [COL-B], 
     @COl3  = NULL, 
     @COL4  = [COL-C],  
     @COL5  = [COL-D], 
     @COL6  = [COL-E]  

FROM INSERTED 

    UPDATE [dbo].[TABLE2] 
    SET [COL2]   = @COL2, 
     [COL3]   = @COL3, 
     [COL4]   = @COL4, 
     [COL5]   = @COL5 


    WHERE COL2 = @PKCOL1 

我收到語法錯誤,其中contition。

@ PKCOL1附近的語法不正確。

能oany幫我請...

+1

看起來你需要和'END'關閉'BEGIN'之前的select語句。沒有SQL Server方便,所以我無法測試。此外,SQL Server每條語句觸發一次,而不是每行一次。如果[GP]。[dbo]。[TABLE1]中的更新超過一行,您將中斷。而不是從插入中選擇一行的值,而是使用dbo.table2的一個更新從插入中讀取並處理所有行。例如:'update trgt,set .... from dbo.table2 trgt inner join inserted I on trgt.col2 = I. [COL-A]' – 2011-05-31 22:29:41

回答

4

首先,答案很可能是因爲你有沒有匹配的結束語句開頭。其次,這更重要 - 觸發器假定一次只更新一行。觸發器每個操作只觸發一次,並且可以更新許多行(即INSERTED表有多行)。在你的代碼中,你只是從INSERTED中檢索一行,並用這一行中的值更新TABLE2。你會更好做這樣的事情:

UPDATE Table2 SET 
    [Col2] = i.[Col-B] 
    , [Col3] = NULL 
    , [Col4] = i.[Col-C] 
    , [Col5] = i.[Col-D] 
FROM Table2 
JOIN INSERTED i ON Table2.Col2 = i.[Col-A] 

(未測試的代碼警告)

+0

+1對於有多行的「插入」警告! – 2011-06-01 04:51:01

+2

我覺得你需要在'FROM'子句中有'Table2'才能使這個表單起作用。 – 2011-06-01 08:02:07

+0

@Damien你絕對正確 - 謝謝。我會解決它。這就是我在早晨喝咖啡之前編寫僞代碼的原因:) – 2011-06-01 11:42:51