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 に答える