Возврат результата выполнения хранимой процедуры в ADODB.Recordset

khabarova_vi
Дата: 07.04.2006 07:22:39
Здравствуйте! Пишу макрос, в котором неоходимо результат выполнения хранимой процедуры вернуть в ADODB.Recordset. Что только ни делала. Использовала и ADODB.Recordset.Openи ADODB.Command.Execute- ничего не получается. Хранимая процедура выполняется но ADODB.Recordset после ADODB.Recordset.Open или ADODB.Command.Execute закрыт. Последняя строчка в хранимой процедуре - простой селект, два входных параметра каждый из которых представляет собой строку в формате - 'гггг.мм.дд'. Синтаксис вызова в SQL Query Analyser:
execute dbo.spx_report_RNU46_spis @data1='2005.01.01', @data2='2005.12.31'.
Вызов возвращает 87 строк. Результат вызова т.е. эти 87 строк необходимо вставить в активный рабочий лист активной рабочей книги.
За последние дни мучений с этим вопросом выяснилось что хранимая процедура выполняется но не полностью, т.е. после первого оператора который обрабатывает некоторое количество записей (т.е. после того как первый раз происходит 87 rows affected) выполнение хранимой процедуры прекращается, а первый такой оператор это insert в предварительно созданную таблицу. Логично. Этот оператор строк не возвращает поэтому после выполнения set ADODB.Recordset = ADODB.Command.Execute() рекордсет оказывается пустым и переводится в состояние "закрыт". И что с этим делать не знаю. Как сделать так чтобы процедура выполнилась до конца?
insert #reg_47_all(idinv, invno, nameinv, first_cost, numgr, real_srok, pred_sobstv, srok_pol_pred_use, spec_koef, norm_amort, MonthWear, YearWear, TotalWear, date_expl, date_ist, nseries, idTaxes)
select distinct t.idinv, a.invno, a.nameinv, 0, ta.Numgr, ta.Srok_1,
IsNull(a. srok_pred_use, 0), IsNull(a.srok_pol_pred_use, 0), IsNull(a.spec_koef,0),
0, 0, 0, 0, null, null, t.nseries, ta.idtaxes
from taxes_history t (nolock), assets a (nolock), taxes ta (nolock)
where dtstart between @date1 and @date2time and a.idinv = t.idinv
and a.idtaxes_nu = ta.idtaxes and num_rnu = @RNU46
and t.status In(@stWork, @stHand, @stWithdrawal, @stInpRest, @stStorage)
/**/and t.IdInv in (select IdInv from taxes_history th where th.status=4 and th.dtstart between @date1 and @date2time
/**/and IdInv in (select IdInv from history h, reason r where h.IdEnt=r.IdEnt and r.Name like 'Списание%' and h.DateP between @date1 and @date2time))

Вот после этого оператора (после того как в таблицу #reg_47_all было вставлено 87 строк) выполнение хранимой процедуры прекращается.
buser
Дата: 07.04.2006 09:00:38
Это просто... Уж такова специфика работы с ADO. Первой строкой в хранимой пр-ре set nocount on. Если пр-ра возвращает более одного набора их перебор осуществляется через NextRecordset. Удачи.
khabarova_vi
Дата: 07.04.2006 20:39:41
Спасибо, buser. Попробую. Надеюсь что получится :)
pol_ar
Дата: 29.07.2011 13:58:51
Опция
set nocount on
помогает, но не во всех случаях. Посмотрите, может знаете в чем здесь дело...

--Вариант 1 - работает...
set nocount on
select * into #tmp from pol_temp
insert #tmp select * from pol_temp
insert #tmp select * from pol_temp
select * from #tmp
drop table #tmp

--Вариант 2 - НЕ работает...
set nocount on
SET ANSI_WARNINGS OFF
declare @temptable as table(
DatabaseName nvarchar(128),
LogSize float(7),
LogSpaceUsed float(7),
Status1 int)

INSERT INTO @temptable
EXEC ('DBCC SQLPERF(LOGSPACE) WITH NO_INFOMSGS')

select * from @temptable
buser
Дата: 29.07.2011 14:09:09
Что демонстрируют эти примеры? И что значит не работает? Запустите вариант 2а в SSMS и посмотрите результат...