0

カーソルやループロジックを使用せずに、私がやろうとしていることを行う方法があるかどうかを確認したいと思います。私はこれらの2つのテーブルを持っています。と の間には 1 対多の関係がFileRunDataありInvoice、 によってリンクされていますRunId/FileRunId

CREATE TABLE [dbo].[FileRunData](
    [RunId] [uniqueidentifier] primary key,
    [Status] [varchar](25) NOT NULL,
    [IsEmailSent] [bit] NOT NULL
)

CREATE TABLE [dbo].[Invoice](
    [FileRunId] [uniqueidentifier] NULL,
    [InvoiceId] [uniqueidentifier] primary key,
    [InvoiceType] [varchar](20) NOT NULL,
    [Status] [varchar](25) NULL
)

以下の条件でメール通知を送信したい。

FileRunDataifでは、テーブルStatus='Processed' and IsEmailSent=0内のすべての行をチェックしてその行を確認する必要があり、その場合はメールを送信する必要があります。InvoiceFileRunIdStatus is 'Invoiced'

私のアプローチ(ここではカーソルを使用します)

  1. FileRunData から RunIds を選択します
  2. RunId ごとに、Invoice からその RunId の行数を取得します。
  3. Status='Invoiced' を持つその RunId の行数を取得します
  4. 3 と 4 の両方が等しい場合、メールを送信します
4

1 に答える 1

0

いくつかの否定を追加することで、私があなたをひどく誤解していない限り、問題は理解しやすくなると思います. 以外のステータスを持つ行がある場合、電子メールを送信したくありませんInvoiceInvoiced

SELECT frd.RunId
FROM FileRunData frd
WHERE frd.Status = 'Processed' AND
      frd.IsEmailSent = 0 AND
      NOT EXISTS (select * from Invoice i
                   where i.FileRunID = frd.RunID and
                         i.Status != 'Invoiced')

条件を満たす実行の ID を選択する必要があります。RunId残念ながら、これらの値を使用し、そのような結果ごとに 1 つの電子メールを送信する必要がある場合、残念ながら、この時点ではカーソル1を使用してこの結果セットを処理し、実際のsp_send_dbmail呼び出しを行う必要があります。


1または、各行を順番に処理する道徳的に同等の方法。私は通常、カーソルを使用しますが、一部の人々は、SQL に表示される単語に嫌悪感を抱き、代わりに一時テーブルと while ループを作成することを主張します。

于 2014-03-11T11:27:39.017 に答える