使用IF语句检查select语句的结果是否为'N' 但是select语句返回多行,因此破坏了IF语句
我试图将结果存储在变量中:
Declare @SENT bit;
SET @SENT = (SELECT AlrdySent FROM DeliveryNotesNotMatchingSO)
IF @SENT = 'N'
INSERT INTO DeliveryNotesNotMatchingSO
([Docnum],
[AlrdySent])
Select
t1.DocNum as [DocNum],
'N' as [AlrdySent]
from miro.dbo.DLN1 t0
join miro.dbo.odln t1 on t0.DocEntry = t1.DocEntry
where day(t1.DocDate) = day(getdate())
and month(T1.DocDate) = month(getdate())
and year(T1.DocDate) = year(getdate())
and t0.BaseEntry is null
---Statement in Question
IF (SELECT AlrdySent FROM DeliveryNotesNotMatchingSO) = 'N'
BEGIN
---CODE HERE
我希望IF语句针对select语句中的每个结果执行,猜想我需要以某种方式逐行执行此操作吗?
在逻辑上检查AlrdySent的值是否有更好的方法?
答案 0 :(得分:2)
在这种情况下,实际上需要一个游标来循环记录的情况占1%,因为您必须通过SP发送电子邮件(我认为这是逐个邮件工作)。
CURSOR是一个对象,它使您可以循环浏览一组行,一次一行。您可以使用以下简单的光标示例:
DECLARE @ID INT
DECLARE @AdditionalParameter VARCHAR(1000)
DECLARE MailingCursor CURSOR FOR
SELECT
D.ID,
D.AdditionalParameter
FROM
DeliveryNotesNotMatchingSO AS D
WHERE
D.AlrdySent = 'N'
OPEN MailingCursor
FETCH NEXT FROM MailingCursor INTO @ID, @AdditionalParameter
WHILE @@FETCH_STATUS = 0 -- While the last fetched row was successfully fetched
BEGIN
EXEC dbo.uspSendMail
@Input = @ID,
@Recipient = @AdditionalParameter
UPDATE D SET
AlrdySent = 'Y',
SentDate = GETDATE()
FROM
DeliveryNotesNotMatchingSO AS D
WHERE
D.ID = @ID -- Assumming its a PK
FETCH NEXT FROM MailingCursor INTO @ID, @AdditionalParameter
END
CLOSE MailingCursor
DEALLOCATE MailingCursor