如何检查Select语句是否返回多行

时间:2019-10-18 09:08:00

标签: sql sql-server tsql

使用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的值是否有更好的方法?

1 个答案:

答案 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
相关问题