![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возврат набора данных из stored proc [D7, MSSQL]
deadbitch © (2004-01-31 19:13:00)
Как вернуть в MSSQL из хранимой процедуры набор данных подобно тому как это делается в IB (через цикл и SUSPEND)? У меня есть книга MS SQL Server 2000/Е. Мамаев, но там о такой возможности ни слова. Разве такой возможности нет???
deadbitch (2004-02-01 12:00:00) [1]
Черт, ведь там .Open есть для таких случаев. :)
deadbitch (2004-02-01 11:16:00) [2]
Ладно, признаю ошибку, бо в MSSQL я новичок. Как-то раньше до group by не допер. Ну а теперь не пойму почему у меня не видно этого селекта. Вот процедура:
CREATE PROCEDURE p_getPN
AS
select distinct A.[Profile], sum(B.Energy)
from T_StructureDistribution A, T_MonthCount B
where (A.ControlChannel_ID = B.ControlChannel_ID) and
(A.[Profile] LIKE "ПН%") and
(B.[Month] LIKE "Январь") and
(B.[Year]=2004)
group by A.[Profile]
GO
Взял TADOStroredProc, к ней TDataSet, к нему - TDBGRid. Делаю .ExecProc - а грид пустой, хотя в Query Analyzer"e все пашет. В чем проблема?
vuk (2004-01-31 21:50:00) [3]
На первый взгляд все проблемы решаются при помощи group by. И никаких временных таблиц и курсоров.
deadbitch (2004-01-31 21:10:00) [4]
/* Запихивает в таблицу T_ProfileStrPN энергии по сечениям на производственные нужды */
/* mode = 1 - using @month and @year */
/* mode = 0 - using ONLY @year */
CREATE proc p_getStructureProfilesPNEnergy
@mode tinyint,
@month varchar(15),
@year int
as
>declare profiles cursor scroll local for
> select distinct [Profile] from T_StructureDistribution where
> ([Profile] <> NULL) and (len([Profile]) > 10) and >([Profile] LIKE "ПН%")
declare @profile1 varchar(100)
declare @energy bigint
delete from T_ProfileStrPN where (len([Profile]) >= 0)
open profiles
fetch first from profiles into @profile1
while (@@fetch_status = 0)
begin
set @energy = 0
if (len(@profile1) > 10) and (@profile1 <> NULL)
begin
if @mode = 1
select @energy = sum(Energy) from T_MonthCount where
([Month] LIKE @month) and ([Year] = @year) and
(ControlChannel_ID in (select ControlChannel_ID from T_StructureDistribution where [Profile] = @profile1))
else
select @energy = sum(Energy) from T_MonthCount where
([Year] = @year) and
(ControlChannel_ID in (select ControlChannel_ID from T_StructureDistribution where [Profile] = @profile1))
insert into T_ProfileStrPN ([Profile], Energy) values (@profile1, @energy)
end
fetch from profiles into @profile1
end
close profiles
deallocate profiles
GO
Здесь бы мне @energy и @profile1 и выдать бы как строку данных из процедуры, а не пихать в таблицу. Так можно сделать это как в IB или нет, вот в чем вопрос?
vuk (2004-01-31 20:20:00) [5]
to deadbitch:
>У меня идет выборка данных через курсор
А смысл использовать курсоры для выборок?
deadbitch (2004-01-31 20:07:00) [6]
Хе. А мне так не катит. У меня идет выборка данных через курсор, по этим данным считаются суммы по столбцам из другой таблицы. И нады выдать на выходе набор данных где в строке - поле из табл. 1 и сумма для этого значения. Пока оно суется во временную таблицу и уже отуда селект, но это долго... :(
vuk (2004-01-31 19:35:00) [7]
Просто написать select. Без всяких выкрутасов.