使用触发器基于另一个表的特定值更新一个表中的特定值

时间:2018-09-24 14:33:02

标签: sql sql-server sql-server-2014

正如标题所述,我正在尝试根据另一个表中另一个表的特定列是什么来更新一个表中的特定行和列更新为。我无法在堆栈溢出中找到任何特定于我要执行的操作的东西。到目前为止,它要么基于同一张表更新一个表,要么根据列是否更改(不查找特定值)进行更新。

也就是说,到目前为止,我已经根据我对堆栈溢出的研究整理了以下代码:

CREATE TRIGGER trUpdateTaskToComplete on [DBName].[dbo].[Projects]
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE [DBName].[dbo].[TaskTracker]
    SET Complete=1
    FROM [DBName].[dbo].[Projects] t
    INNER JOIN inserted i on t.id = i.id
    AND i.Status='Complete'
END

这完成了我需要执行的90%的操作,但它会更新TaskTracker表上与项目ID关联的所有行。我如何才能仅在Task(TaskTracker的一列)的值为“ ProjectIsComplete”的行上设置Complete = 1?我尝试过这样的事情:

    UPDATE [DBName].[dbo].[TaskTracker]
    SET Complete=1
    WHERE Task = "ProjectIsComplete"
    FROM [DBName].[dbo].[Projects] t
    INNER JOIN inserted i on t.id = i.id
    AND i.Status='Complete'

但是似乎SQL Server的寿命不长。我该怎么做才能使扳机工作?注意:我仅将Task值为“ ProjectIsComplete”且行设置为完整的字段仍用于相关ID。感谢您提供的任何建议!

1 个答案:

答案 0 :(得分:0)

感谢塞恩·兰格。正确的代码如下:

CREATE TRIGGER trUpdateTaskToComplete on [DBName].[dbo].[Projects]
AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;

    UPDATE [DBName].[dbo].[TaskTracker]
    SET Complete=1
    FROM [DBName].[dbo].[Projects] t
    INNER JOIN inserted i on t.id = i.id
    AND i.Status='Complete'
    WHERE Task = 'Complete'
END