Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как записать результаты работы ХП в курсор  [new]
Тройка
Member

Откуда:
Сообщений: 88
Добрый день. Мне нужно пройтись циклом по выборке, которая возвращается из хранимой процедуры. Я подумал, что логично было бы записать ее в курсор и потом из него фетчить. Но что-то у меня не получилось это реализовать. При этом, хотелось бы выбирать не все поля из выборки, а самому указать необходимые. Т.е. нужно сделать нечто типа:
    DECLARE @MyCursor CURSOR FOR 
    	select <список полей> from (exec my_proc @param1)

Вроде как нашел тут как можно это реализовать для вызова ХП из прилинкованого сервера:
select  <список полей>
from	OPENQUERY (<название линкованного сервера>,'exec <название ХП>')

Похоже на то что нужно, но как это можно сделать в пределах одной базы?
P.S. База данных MS SQL 2000
5 июл 13, 17:02    [14529050]     Ответить | Цитировать Сообщить модератору
 Re: Как записать результаты работы ХП в курсор  [new]
Glory
Member

Откуда:
Сообщений: 104751
create table #x (....)
insert #x exec my_proc @param1
select * from #x
5 июл 13, 17:08    [14529087]     Ответить | Цитировать Сообщить модератору
 Re: Как записать результаты работы ХП в курсор  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
insert exec 
контрукция называеться..и делайте что хотите с таблицей
5 июл 13, 17:09    [14529094]     Ответить | Цитировать Сообщить модератору
 Re: Как записать результаты работы ХП в курсор  [new]
Тройка
Member

Откуда:
Сообщений: 88
Glory, Maxx

С темповой таблицей вариант, но мне не нравится что нужно "вручную" самому ее создавать, т.к. если изменится количество полей в результирующем наборе, возвращаемом процедурой, и/или тип некоторого поля в нем, то по идее возможны ошибки. Вспомнил, что когда-то сам делал так при запросе с прилинкованого сервера (черт, опять прилинкованый сервер, почему у меня с ним меньше проблем чем с локальным ):
  declare @ora_txt varchar(2500);

  select @ora_txt = 'select * into ##temp_table from openquery(oracle_db, 'select * from TABLE (some_pipelined_function())'

  exec (@ora_txt)

При этом таблица ##temp_table создавалась сама!!! Как можно будет это реализовать в этом случае?

Мне вообще нужно из функции всего два поля, можно их как-то отдельно выбрать из всего результата? Тогда все вышеописанные проблемы становиться менее актуальны. Т.е. что-то типа:
create table #x (....)
insert #x exec <список полей> my_proc @param1
select * from #x 
5 июл 13, 17:42    [14529307]     Ответить | Цитировать Сообщить модератору
 Re: Как записать результаты работы ХП в курсор  [new]
Glory
Member

Откуда:
Сообщений: 104751
Тройка
С темповой таблицей вариант, но мне не нравится что нужно "вручную" самому ее создавать, т.к. если изменится количество полей в результирующем наборе, возвращаемом процедурой, и/или тип некоторого поля в нем, то по идее возможны ошибки.

Ага, а если типа из процедуры уберут одно из нужных вам полей, то ошибки не возникнет ?

Тройка
Мне вообще нужно из функции всего два поля

Уже не процедура а функция ?

Тройка
При этом таблица ##temp_table создавалась сама!!! Как можно будет это реализовать в этом случае?

И зачем тут динамика и глобальная таблица ?
select * into ##temp_table from openquery(oracle_db, 'select * from TABLE (some_pipelined_function())')


Сообщение было отредактировано: 5 июл 13, 17:48
5 июл 13, 17:45    [14529329]     Ответить | Цитировать Сообщить модератору
 Re: Как записать результаты работы ХП в курсор  [new]
Тройка
Member

Откуда:
Сообщений: 88
Glory
Тройка
С темповой таблицей вариант, но мне не нравится что нужно "вручную" самому ее создавать, т.к. если изменится количество полей в результирующем наборе, возвращаемом процедурой, и/или тип некоторого поля в нем, то по идее возможны ошибки.

Ага, а если типа из процедуры уберут одно из нужных вам полей, то ошибки не возникнет ?

Понятно что возникнет. Но в этом случае даже теоретически не возможно что-либо реализовать если нет исходных данных. А вот если представить, что изменились другие поля в процедуре, которые в данном контексте не используются, то хотелось что бы все работало если есть необходимые данные.
5 июл 13, 17:53    [14529371]     Ответить | Цитировать Сообщить модератору
 Re: Как записать результаты работы ХП в курсор  [new]
Тройка
Member

Откуда:
Сообщений: 88
Glory
Тройка
Мне вообще нужно из функции всего два поля

Уже не процедура а функция ?

Извиняюсь, сам ввожу в заблуждение. Меня интересует именно процедура, а не UDF

Glory
И зачем тут динамика и глобальная таблица ?

Конкретно в том случае данные из прилинкованого сервера еще джоинились с локальными таблицами. Может не самый лучший вариант, но мне показалось что так будет удобнее с темповой таблицей. Важно что все же оно так работает без необходимости предварительно создавать таблицу
5 июл 13, 18:03    [14529434]     Ответить | Цитировать Сообщить модератору
 Re: Как записать результаты работы ХП в курсор  [new]
Glory
Member

Откуда:
Сообщений: 104751
Тройка
Понятно что возникнет. Но в этом случае даже теоретически не возможно что-либо реализовать если нет исходных данных. А вот если представить, что изменились другие поля в процедуре, которые в данном контексте не используются, то хотелось что бы все работало если есть необходимые данные.

Не вижу разницы - изменение интерфейса должно сопровождаться проверкой всех использующих его программ.
5 июл 13, 18:04    [14529438]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить