我想看看是否有任何方法可以在不使用游标或任何循环逻辑的情况下做我想做的事情。我有这两个桌子。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'
,则必须发送电子邮件。
我的方法(将在此处使用光标)
我认为,通过加上一些否定,这个问题更容易理解,除非我严重误解了您。我们不希望发送电子邮件,如果有任何排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循环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句