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



我想看看是否有任何方法可以在不使用游标或任何循环逻辑的情况下完成我正在尝试做的事情。我有这 2 张桌子。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如果Status='Processed' and IsEmailSent=0,那么我必须检查Invoice表中的所有行以查找该FileRunId,如果它们Status is 'Invoiced',那么我必须发送电子邮件。

我的方法(将在此处使用光标)

  1. 从文件运行数据中选择运行 ID
  2. 对于每个 RunId,从发票中获取该 RunId 的行数
  3. 获取状态="已开票"的该 RunId 的行数
  4. 如果两个3和4相等,则发送电子邮件

我认为通过添加几个否定,问题更容易理解,除非我严重误解了你。如果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 循环,例如。

相关内容

  • 没有找到相关文章

最新更新