我不是新來的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
謝謝大家。
我不看你怎麼是*連接*在'插入更新所插入的那些行/ '您的'Projects'表中的行的僞表。在'WHERE'子句中應該有'inserted.ID = projects.ID'之類的東西。另外:'date_complete'是否真的是該值,或者是數據庫中的'NULL',並且在GUI中顯示爲'1900-01-01'?另外:請仔細閱讀** DATETIME欄,因爲它們還包含**時間**部分! – 2014-12-03 09:49:34
首先嚐試使用沒有條件的觸發器「AND projects.date_complete ='1900-01-01'」。如果工作完美,那麼問題在於日期比較。 – Veera 2014-12-03 09:51:02
乾杯傢伙。 marc_s - 日期字段默認爲'1900-01-01'。不爲null。就像我說的,我對觸發器很陌生,所以我會在where子句中查看inserted.id = projects.id比較。維拉 - 謝謝我也會考慮這一點。 – Urbley 2014-12-03 09:59:09