Использование курсора для запроса значений MS SQL

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

К примеру создал такую таблицу:

create table MyTab
(t1 int not null,
t2 float not null,
t3 datetime not null,
t4 nvarchar(max) not null);

insert into MyTab (t1, t2, t3, t4)
values 
    (1, 2.5, '2022-11-10 15:00:00', 'aa'),
    (2, 3.5, '2022-11-11 16:00:00', 'bb'),
    (3, 4.5, '2022-11-12 17:00:00', 'cc'),
    (4, 1.5, '2022-11-15 10:00:00', 'dd');

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

Делаю следующее:

declare m_cursor scroll cursor
for (select * from MyTab)
declare @c1 int, @c2 float, @c3 datetime2(0), @c4 nvarchar(2)
open m_cursor
fetch first from m_cursor into @c1, @c2, @c3, @c4
print @c1 + ' '   @c2 + ' ' + @c3 + ' ' + @c4
while @@fetch_status = 0
begin
fetch next from m_cursor into @c1, @c2, @c3, @c4
print @c1 + ' '  +  @c2 + ' ' + @c3 + ' ' + @c4
end
close m_cursor
deallocate m_cursor;

Но так идут ошибки конвертации типов данных.

Нужно, чтобы получилось так на выходе:

1 2.5 2022-11-10 15:00:00 aa
2 3.5 2022-11-11 16:00:00 bb
3 4.5 2022-11-12 17:00:00 cc
4 1.5 2022-11-15 10:00:00 dd

Если выводить каждое значение столбца через print в отдельной строке, тогда код работает.


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

Автор решения: Akina
declare m_cursor scroll cursor for (select * from MyTab)
declare @c1 int, @c2 float, @c3 datetime2(0), @c4 nvarchar(2)
open m_cursor
fetch first from m_cursor into @c1, @c2, @c3, @c4
print CONCAT_WS(' ', @c1, @c2, @c3, @c4)
while @@fetch_status = 0
begin
    fetch next from m_cursor into @c1, @c2, @c3, @c4
    print CONCAT_WS(' ', @c1, @c2, @c3, @c4)
end
close m_cursor
deallocate m_cursor
1 2.5 2022-11-10 15:00:00 aa
2 3.5 2022-11-11 16:00:00 bb
3 4.5 2022-11-12 17:00:00 cc
4 1.5 2022-11-15 10:00:00 dd
4 1.5 2022-11-15 10:00:00 dd

fiddle


Оставил, как у автора, отдельный FETCH FIRST. Хотя мне его необходимость в данном коде непонятна, достаточно

declare m_cursor scroll cursor for (select * from MyTab)
declare @c1 int, @c2 float, @c3 datetime2(0), @c4 nvarchar(2)
open m_cursor
while @@fetch_status = 0
begin
    fetch from m_cursor into @c1, @c2, @c3, @c4
    print CONCAT_WS(' ', @c1, @c2, @c3, @c4)
end
close m_cursor
deallocate m_cursor
→ Ссылка