0

我想看看是否有任何方法可以在不使用游标或任何循环逻辑的情况下做我想做的事情。我有这两张桌子。和之间存在一对多关系FileRunDataInvoice它们由 链接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
)

我想针对以下情况发送电子邮件通知。

FileRunDataifStatus='Processed' and IsEmailSent=0中,那么我必须检查Invoice表中的所有行FileRunId,如果它们Status 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来处理此结果集并进行实际sp_send_dbmail调用。


1或任何道德上等效的依次处理每一行的方式。我通常只使用游标,但有些人甚至讨厌这个词,甚至出现在他们的 SQL 中,并坚持创建临时表和 while 循环,例如。

于 2014-03-11T11:27:39.017 回答