0

我有以下触发器:

BEGIN
DECLARE @email varchar(200)
DECLARE @jobcode int
DECLARE @status char(1)

DECLARE @emaild varchar(200)
DECLARE @jobcoded int
DECLARE @statusd char(1)

SET @statusd = NULL

SELECT @status = z.status, @email = p.EMail, @jobcode = z.jobID
    FROM zipoutfiles z
    INNER JOIN inserted AS i ON z.jobID = i.jobID
    INNER JOIN PS_LoginUser AS p ON z.UserID = p.UserID

SELECT @statusd = z.status, @emaild = p.EMail, @jobcoded = z.jobID
    FROM zipoutfiles z
    INNER JOIN deleted AS d ON z.jobID = d.jobID
    INNER JOIN PS_LoginUser AS p ON z.UserID = p.UserID
    WHERE d.jobID = @jobcode


IF ((@status = 'D' AND @statusd = 'R') OR (@status = 'D' AND @statusd = 'E'))
BEGIN
    EXEC SendMail @email, @jobcode
END
END

我希望能够在状态从 E 到 D 或 R 到 D 时运行 SendMail,但不是从 D 到 D(如果它再次更新)以及当它作为 D 插入时。我在这里做错了什么:

4

1 回答 1

1

不确定您的表架构是什么,但这可能会为您提供所有适当的电子邮件:

select p.EMail as Email, z.JobId as JobCode
  from ZipOutFiles as ZOF inner join
    inserted as i on i.JobId = ZOF.JobId inner join
    PS_LoginUser as PLU on PLU.UserId = ZOF.UserId left outer join
    deleted as d on d.JobId = ZOF.JobId
    where
      ( d.Status = 'E' and i.Status = 'D' ) or -- E -> D.
      ( d.Status = 'R' and i.Status = 'D' ) or -- R -> D.
      ( d.Status is NULL and i.Status = 'D' ) -- Inserted D.

我假设您并没有真正更新JobId. 如果是这样,你如何匹配前后行?

还假设Status不能NULL。如果是这样,则需要修改最后一个条件以正确检测在deleted表中没有找到相应的行。

于 2012-08-03T01:27:17.660 回答