Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не хочу объявлять переменные в цикле по курсору для каждого поля выборки  [new]
ораклоид2017
Guest
Добрый день.
Спрашивал у яндекса, но так ничего и не нашёл.
Везде в документации написано, что в цикле по курсору надо объявлять переменные отдельно для каждого поля из выборки. Можно ли как-то этого не делать ?
Вот пример из Oracle:
FOR cur IN (select f1, f2 ... fn from table)
-- или FOR cur IN (select * from table)
LOOP
  if cur.f1 = cur.f2 then 
    insert into table2 (n1,n2) values (cur.f5, cur.f10);
...
END LOOP;


Обратите внимание, в теле цикла обращаемся сразу к полям курсора без каких-то промежуточных переменных.
Есть такое в T-SQL ?

Ну хотя бы можно ли объявить одну переменную типа строки, которой присвоить сразу всю строку, а потом уже через неё выходить на каждое поле не заводя для каждого из них отдельную переменную ?
14 июл 17, 20:16    [20645981]     Ответить | Цитировать Сообщить модератору
 Re: Не хочу объявлять переменные в цикле по курсору для каждого поля выборки  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
ораклоид2017,

Нельзя. Хотите как в оракле - используйте оракл. А раз используете SQL server то будьте любезны следовать правилам transact-sql.

Ну и в догонку: В большинстве случаев использование курсора вообще не является необходимым. Не задумывались решить свою задачу без него?
14 июл 17, 20:20    [20645989]     Ответить | Цитировать Сообщить модератору
 Re: Не хочу объявлять переменные в цикле по курсору для каждого поля выборки  [new]
ораклоид2017
Guest
felix_ff
ораклоид2017,

Нельзя. Хотите как в оракле - используйте оракл. А раз используете SQL server то будьте любезны следовать правилам transact-sql.

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


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

Есть таблица, точнее выборка, которая возвращает что-то типа этого:

N | I
-----
А 2
А 4
B 1
B 8
С 5

Мне надо вывести итоговые суммы по каждой группе и вставить пустые строки для наглядности:
N | I
-----
А   2
А   4
    6


B   1
B   8
    9


С   5
    5


Вот и думал пройтись по курсору. В Oracle я бы, конечно, это сделал сразу в одном select-е.
14 июл 17, 20:28    [20646001]     Ответить | Цитировать Сообщить модератору
 Re: Не хочу объявлять переменные в цикле по курсору для каждого поля выборки  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1172
ораклоид2017,

Почитайте справку по group by rollup/ cube
14 июл 17, 20:31    [20646007]     Ответить | Цитировать Сообщить модератору
 Re: Не хочу объявлять переменные в цикле по курсору для каждого поля выборки  [new]
ораклоид2017
Guest
felix_ff
ораклоид2017,

Почитайте справку по group by rollup/ cube


Хм, даже не подумал что в T-SQL это тоже есть. Пошёл читать... Спасибо.
14 июл 17, 20:34    [20646013]     Ответить | Цитировать Сообщить модератору
 Re: Не хочу объявлять переменные в цикле по курсору для каждого поля выборки  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
declare @t table (N varchar(10), I int);

insert into @t
values
 ('A', 2),
 ('A', 4),
 ('B', 1),
 ('B', 8),
 ('C', 5);

with t as
(
 select
  N, sum(I) as I, grouping(I) as g, rank() over (order by N desc) as rnk
 from
  @t
 group by
  grouping sets((N), (N, I))
)
 select
  case when t.g = 1 then '' else t.N end,
  case when t.g = 1 and a.rn = 1 then '' else cast(t.I as varchar(10)) end
 from
  t cross apply
  (select 0 union all select 1 where t.g = 1 and t.rnk > 1) a(rn)
 order by
  t.N, a.rn;
14 июл 17, 22:09    [20646164]     Ответить | Цитировать Сообщить модератору
 Re: Не хочу объявлять переменные в цикле по курсору для каждого поля выборки  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Как только люди не извращаются в sql для решения задач, для которых предназначены абсолютно другие инструменты.
14 июл 17, 22:47    [20646233]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить