在SQL中使用游标/循环的替代方法

时间:2014-03-11 10:02:15

标签: sql-server-2008 cursor sp-send-dbmail

我想看看有没有办法在不使用游标或任何循环逻辑的情况下做我想做的事情。我有这两张桌子。 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
)

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

FileRunData if Status='Processed' and IsEmailSent=0中,我必须检查Invoice表中FileRunId的所有行,如果他们的Status is 'Invoiced',然后我必须发一封电子邮件。

我的方法(将在这里使用光标)

  1. 从FileRunData
  2. 中选择RunIds
  3. 对于每个RunId,从Invoice
  4. 获取该RunId的行数
  5. 获取具有Status ='Invoiced'的RunId的行数
  6. 如果3和4都相同,则发送电子邮件

1 个答案:

答案 0 :(得分:0)

我认为通过添加一些否定,问题更容易理解,除非我严重误解了你。我们想要发送电子邮件,如果Invoice中的任何行的状态其他而不是Invoiced

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循环,例如。