我想看看有没有办法在不使用游标或任何循环逻辑的情况下做我想做的事情。我有这两张桌子。 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
)
我想针对以下情况发送电子邮件通知。
在FileRunData
if Status='Processed' and IsEmailSent=0
中,我必须检查Invoice
表中FileRunId
的所有行,如果他们的Status is 'Invoiced'
,然后我必须发一封电子邮件。
我的方法(将在这里使用光标)
答案 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循环,例如。