Курсор затирает данные. MS SQL

Не могу понят почему затираются данные. В первой выборке использовал три записи, например нашел трех сотрудников.

В курсоре делаю запрос еще в 2 таблицы, проверяю если ли курс в таблице с пройденными курсами и в таблице с активными курсами и записываю в переменную. Если нет у сотрудника курсов ни пройденных, ни активных, в PRINT запись пропадает, почему-то?

create table personTest ( 
    id bigint primary key ,
    name varchar(MAX) not null,
);

insert into personTest values (1, 'Anna');
insert into personTest values (2, 'Andrey');
insert into personTest values (3, 'Kate');

create table activeCource ( 
    id bigint primary key ,
    name varchar(MAX) not null,
    person_id bigint
);

insert into activeCource values (1, 'Cource ololo', 1);
insert into activeCource values (2, 'Cource trololo', 2);


create table passedCource ( 
    id bigint primary key ,
    name varchar(MAX) not null,
    person_id bigint
);

insert into passedCource values (1, 'Cource ololo', 1);
insert into passedCource values (2, 'Cource trololo', 3);

DECLARE  @current_person BIGINT
        ,@person_fullname VARCHAR(MAX)
        ,@course_result VARCHAR(20) = 'Данных нет'

DECLARE @cursor CURSOR

SET @cursor = CURSOR SCROLL FOR
    SELECT 
         cls.id
        ,cls.name
    FROM personTest AS cls

OPEN @cursor

FETCH NEXT FROM @cursor INTO @current_person, @person_fullname
WHILE @@FETCH_STATUS = 0 BEGIN

    SELECT @course_result = (
        SELECT 
            CASE 
                WHEN ISNULL(pls.id, 0) != 0 THEN 'Курс назначен'
                ELSE 'Данных нет'
            END AS is_exists
        FROM activeCource AS pls
        WHERE pls.person_id = @current_person
    ) --например у одного сотрудника (Kate) тут ни чего нет.

    SELECT @course_result = (
        SELECT 
            CASE 
                WHEN ISNULL(pls.id, 0) != 0 THEN 'Курс пройден'
                ELSE 'Данных нет'
            END AS is_exists
        FROM passedCource AS pls
        WHERE pls.person_id = @current_person
    ) 

    PRINT @person_fullname + ' ' + @course_result
    -- Почему то принт выводит только двух сотрудников, а не трех. Понять не могу из за чего. Любой цикл в том же Swift выводит все.
    FETCH NEXT FROM @cursor INTO @current_person, @person_fullname
END

CLOSE @cursor
DEALLOCATE @cursor


Ответы (1 шт):

Автор решения: Aziz Umarov

А если так попробовать то будет 3

Беда в том что переменная @course_result NOT NULL и присвоение NULL в некоторых случаях даёт ошибку. чтобы иправить есть несколько вариантов вот один

DECLARE  @current_person BIGINT
        ,@person_fullname VARCHAR(MAX)
        ,@course_result VARCHAR(20) = 'Данных нет'

DECLARE @cursor CURSOR

SET @cursor = CURSOR SCROLL FOR
    SELECT 
         cls.id
        ,cls.name
    FROM personTest AS cls

OPEN @cursor

FETCH NEXT FROM @cursor INTO @current_person, @person_fullname
WHILE @@FETCH_STATUS = 0 BEGIN

    SELECT @course_result = ISNULL((
        SELECT 
            CASE 
                WHEN ISNULL(pls.id, 0) != 0 THEN 'Курс назначен'
                ELSE 'Данных нет'
            END AS is_exists
        FROM activeCource AS pls
        WHERE pls.person_id = @current_person
    ), 'Данных нет') --например у одного сотрудника (Kate) тут ни чего нет.

    SELECT @course_result = ISNULL((
        SELECT 
            CASE 
                WHEN ISNULL(pls.id, 0) != 0 THEN 'Курс пройден'
                ELSE 'Данных нет'
            END AS is_exists
        FROM passedCource AS pls
        WHERE pls.person_id = @current_person
    ), 'Данных нет' )

    PRINT @person_fullname + ' ' + @course_result
    -- Почему то принт выводит только двух сотрудников, а не трех. Понять не могу из за чего. Любой цикл в том же Swift выводит все.
    FETCH NEXT FROM @cursor INTO @current_person, @person_fullname
END

CLOSE @cursor
DEALLOCATE @cursor

Вот другой

DECLARE  @current_person BIGINT
        ,@person_fullname VARCHAR(MAX)
        ,@course_result VARCHAR(20) = NULL

DECLARE @cursor CURSOR

SET @cursor = CURSOR SCROLL FOR
    SELECT 
         cls.id
        ,cls.name
    FROM personTest AS cls

OPEN @cursor

FETCH NEXT FROM @cursor INTO @current_person, @person_fullname
WHILE @@FETCH_STATUS = 0 BEGIN

    SELECT @course_result = (
        SELECT 
            CASE 
                WHEN ISNULL(pls.id, 0) != 0 THEN 'Курс назначен'
                ELSE 'Данных нет'
            END AS is_exists
        FROM activeCource AS pls
        WHERE pls.person_id = @current_person
    ) --например у одного сотрудника (Kate) тут ни чего нет.

    SELECT @course_result = (
        SELECT 
            CASE 
                WHEN ISNULL(pls.id, 0) != 0 THEN 'Курс пройден'
                ELSE 'Данных нет'
            END AS is_exists
        FROM passedCource AS pls
        WHERE pls.person_id = @current_person
    ) 

    PRINT @person_fullname + ' ' + ISNULL(@course_result, 'Данных нет')
    -- Почему то принт выводит только двух сотрудников, а не трех. Понять не могу из за чего. Любой цикл в том же Swift выводит все.
    FETCH NEXT FROM @cursor INTO @current_person, @person_fullname
END

CLOSE @cursor
DEALLOCATE @cursor
→ Ссылка