Курсор затирает данные. 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