2014-12-03 181 views
2

我不是新來的SQL Server,但我是觸發器的新手。我已經閱讀了一些教程,說實話,語法仍然有點混亂。SQL Server 2008觸發器

我試圖創建一個觸發器,檢查字段被設置爲特定的值,然後更新同一個表中的另一個字段。

希望下面的代碼會自己說話,問題是顯而易見的人

ALTER TRIGGER updateCompletedDate 
ON projects 
AFTER INSERT, UPDATE 
AS 
    IF UPDATE(status) 
    BEGIN 
     UPDATE projects 
     SET date_complete = GETDATE() 
     FROM inserted 
     WHERE inserted.status = 'Completed' 
      AND projects.date_complete = '1900-01-01' 
END 

上面的代碼沒有我希望的效果。當我更新一行並將狀態設置爲Completed時,date_complete列保持默認值1900-01-01

感謝

按marc_s的意見我修改了扳機,現在工作的下面。修復是在where子句中增加了AND inserted.id = projects.id

ALTER TRIGGER updateCompletedDate 
ON projects 
AFTER INSERT, UPDATE 
AS 
IF UPDATE(status) 
BEGIN 
    UPDATE projects 
    SET projects.date_complete = GETDATE() 
    FROM inserted 
    WHERE inserted.status = 'Completed' 
    AND inserted.id = projects.id 
    AND projects.date_complete = '1900-01-01' 
END 

謝謝大家。

+1

我不看你怎麼是*連接*在'插入更新所插入的那些行/ '您的'Projects'表中的行的僞表。在'WHERE'子句中應該有'inserted.ID = projects.ID'之類的東西。另外:'date_complete'是否真的是該值,或者是數據庫中的'NULL',並且在GUI中顯示爲'1900-01-01'?另外:請仔細閱讀** DATETIME欄,因爲它們還包含**時間**部分! – 2014-12-03 09:49:34

+1

首先嚐試使用沒有條件的觸發器「AND projects.date_complete ='1900-01-01'」。如果工作完美,那麼問題在於日期比較。 – Veera 2014-12-03 09:51:02

+0

乾杯傢伙。 marc_s - 日期字段默認爲'1900-01-01'。不爲null。就像我說的,我對觸發器很陌生,所以我會在where子句中查看inserted.id = projects.id比較。維拉 - 謝謝我也會考慮這一點。 – Urbley 2014-12-03 09:59:09

回答

1

我看不出你在你的Projects表連接在Inserted僞表更新到行被插入的那些行/。應該有類似

inserted.ID = projects.ID 

或類似的東西WHERE子句中:

UPDATE p 
SET 
    p.date_complete = GETDATE() 
FROM 
    dbo.Projects p 
INNER JOIN 
    inserted i ON inserted.id = projects.id 
WHERE 
    i.status = 'Completed' 
    AND p.date_complete = '1900-01-01' 
+0

雖然我還沒有嘗試上面的例子,但我仍然將其標記爲答案,因爲您關於鏈接插入的表和項目表的原始評論是解決方案。 – Urbley 2014-12-03 14:56:27

0

嘗試下面的觸發器更改。我只做了一些小的改變。

ALTER TRIGGER updateCompletedDate 
ON projects 
AFTER INSERT, UPDATE 
AS 
BEGIN 
    IF UPDATE(status) 
    BEGIN 
     DECLARE @status AS VARCHAR(20) 
     DECLARE @ID AS INT 

     SELECT @status = status, @ID = ID FROM INSERTED 

     UPDATE projects 
     SET date_complete = GETDATE() 
     WHERE @status = 'Completed' 
     AND id = @ID 
     AND CONVERT(CHAR(10), date_complete, 101) = '1900-01-01' 
    END 
END 
+0

嗨Veera這不適用於我,但不幸的是,但基於marc_s的評論,我設法讓它工作。非常感謝你。我現在編輯該問題以包含修復程序。 – Urbley 2014-12-03 10:12:01