Как проверить в операторе Select Возврат нескольких строк - PullRequest
0 голосов
/ 18 октября 2019

Использование оператора 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 Ответ

2 голосов
/ 18 октября 2019

Это 1% случаев, когда вам действительно нужен курсор для циклической записи, поскольку вы должны отправлять электронные письма через SP (я полагаю, это работает почтой).

A 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...