Курсор в цикле - PullRequest
       35

Курсор в цикле

0 голосов
/ 24 января 2010

Мой курсор и вывод

SET NOCOUNT ON
DECLARE @vendor_id int, @vendor_name nvarchar(50)
DECLARE @subvendor_id int, @subvendor_name nvarchar(50)   
PRINT '-------- Vendor Products Report --------'
DECLARE vend_cursor CURSOR FOR SELECT * FROM MYSEQ

OPEN vend_cursor
FETCH NEXT FROM vend_cursor 
INTO @vendor_id, @vendor_name

WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT ' '
    -- Declare an inner cursor based   
    -- on vendor_id from the outer cursor.
    DECLARE product_cursor CURSOR FOR  SELECT * FROM MYSEQ

    OPEN product_cursor
    FETCH NEXT FROM product_cursor INTO @subvendor_id,@subvendor_name

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF(@subvendor_id >3)
            SELECT * FROM MYSEQ WHERE SQLID =@subvendor_id
            FETCH NEXT FROM product_cursor INTO @subvendor_id,@subvendor_name
    END

    CLOSE product_cursor
    DEALLOCATE product_cursor
    -- Get the next vendor.
    FETCH NEXT FROM vend_cursor INTO @vendor_id, @vendor_name
END 
CLOSE vend_cursor
DEALLOCATE vend_cursor

alt text

Вопрос

Я получаю ответ в нескольких значениях строки. Мне нужно как будто коллекция строк как это

4 text4
5 text5

(также не должно содержать повторяющихся записей)

Редактировать: это только пример запроса. Мне нужно сделать много условий. Вот почему я так написал.

Редактировать курсор

Мне нужны перекрывающиеся записи в дате ...

RowId, CheckIn, CheckOut
1      10 AM    2 PM
2      10.30 AM  11.30 AM
3     8 AM     9 AM

Я хочу выбрать только перекрывающиеся записи, а также сколько перекрывающихся пар ... вот почему я иду на множественный курсор

Ответы [ 3 ]

2 голосов
/ 24 января 2010

Пока что забыли использовать курсоры в SQL ...

На каком языке вы могли бы объявить, что внутренний цикл имеет ту же итерацию, что и внешний цикл? В этом случае оба курсора основаны на SELECT * FROM MYSEQ.

1 голос
/ 05 марта 2016

@@ FETCH_STATUS - глобальная переменная, доступная всем курсорам в соединении, поэтому, когда вложенный курсор закончится, он установит глобальную переменную в -1 (для обозначения конца строк), внешний цикл также завершится.см https://msdn.microsoft.com/en-GB/library/ms187308.aspx

0 голосов
/ 24 января 2010

Три вещи происходят со мной.

Полагаю, это какой-то тест, над которым вы работаете. Но вы определили оба курсора для выполнения одного и того же запроса. Так что это одна из причин, почему вы можете получить дубликаты строк. Конечно, отсутствие четкой бизнес-логики в вашем вопросе затрудняет нам понимание того, чего вы пытаетесь достичь.

Во-вторых, у вас есть вложенный цикл, циклически проходящий через записи одной таблицы в записях другой таблицы. Но вы забыли объединить строки, выбранные внутренним курсором, с текущей строкой внешнего курсора. Таким образом, каждая строка в vend_cursor будет извлекать полностью одинаковый набор строк в product_cursor.

Наконец, product_cursor не сортируется и не фильтруется по ключевому слову distinct. Учитывая два предыдущих пункта, это может не иметь значения. Я просто упоминаю это для полноты картины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...