powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с курсором
7 сообщений из 7, страница 1 из 1
Проблема с курсором
    #32031173
Paul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос такой у меня есть клиент написанный на Crystal Report и соответственно сервер MSSQL2000/
При объявлении курсора:
Declare cr_Summ_Count CURSOR Local Scroll FOR
Select TagIndex From General Order By TagIndex
используется Select, есди в аналайзере запустить этот скрипт, то этот Select отработает, выдаст первую строку, почему?
Когда обработанные данные я подставляю в Crystal Report у меня в отчет выводится не результирующий Select, а первый из курсора?
...
Рейтинг: 0 / 0
Проблема с курсором
    #32031182
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не могли бы вы привести полный скрипт или обьясните, что делает курсор и какие данные возвращаются для репорта ?
...
Рейтинг: 0 / 0
Проблема с курсором
    #32031192
Paul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот полный текст:

CREATE PROCEDURE [sp_Summ_Count] AS
Declare
@TagIndex smallint,
@@Total1 float,
@Total float,
@Fetch smallint

Truncate Table tb_Total_Hour
-----------------------------------------------------
Exec sp_Summ
--За смену
SET NOCOUNT ON
Declare cr_Summ_Count CURSOR Local Scroll FOR
Select TagIndex From General Order By TagIndex
OPEN cr_Summ_Count
FETCH FIRST FROM cr_Summ_Count
INTO @TagIndex
Set @Fetch = 0
WHILE @Fetch = 0
Begin
Set @Total = 0
Set @@Total1 = 0
exec sp_Summ_Smena_Count @TagIndex, @@Total1 Output
Set @Total = @Total + @@Total1
Insert tb_Total_Hour (TagIndex, Smena) Values (@TagIndex, @Total)
FETCH NEXT FROM cr_Summ_Count
INTO @TagIndex
Set @Fetch = @@FETCH_STATUS
End
-- Select * from #tb_Smena_Total
CLOSE cr_Summ_Count
DEALLOCATE cr_Summ_Count
-----------------------------------------------------
--За сутки
Declare cr_Summ_Count CURSOR Local Scroll FOR
Select TagIndex From General Order By TagIndex
OPEN cr_Summ_Count
FETCH FIRST FROM cr_Summ_Count
INTO @TagIndex
Set @Fetch = 0
WHILE @Fetch = 0
Begin
--Set @Total = 0
--Set @@Total1 = 0
exec sp_Summ_Day_Count @TagIndex, @@Total1 Output
--Set @Total = @Total + @@Total1
UPDATE tb_Total_Hour SET [Day] = @@Total1 WHERE [TagIndex] = @TagIndex
FETCH NEXT FROM cr_Summ_Count
INTO @TagIndex
Set @Fetch = @@FETCH_STATUS
End
--Select * from ##tb_Smena_Total
CLOSE cr_Summ_Count
DEALLOCATE cr_Summ_Count
-----------------------------------------------------
--За месяц
Declare cr_Summ_Count CURSOR Local Scroll FOR
Select TagIndex From General Order By TagIndex
OPEN cr_Summ_Count
FETCH FIRST FROM cr_Summ_Count
INTO @TagIndex
Set @Fetch = 0
WHILE @Fetch = 0
Begin
Set @Total = 0
Set @@Total1 = 0
exec sp_Summ_Month_Count @TagIndex, @@Total1 Output
Set @Total = @Total + @@Total1
UPDATE tb_Total_Hour SET [Month] = @Total WHERE [TagIndex] = @TagIndex
FETCH NEXT FROM cr_Summ_Count
INTO @TagIndex
Set @Fetch = @@FETCH_STATUS
End
CLOSE cr_Summ_Count
DEALLOCATE cr_Summ_Count
Select * from tb_Total_Hour
SELECT dbo.Tag.Description, tb_Total_Hour.*
FROM tb_Total_Hour INNER JOIN
dbo.General ON tb_Total_Hour.TagIndex = dbo.General.TagIndex INNER JOIN
dbo.Tag ON dbo.General.TagName = dbo.Tag.Name
Order By tb_Total_Hour.TagIndex
GO
---------
Мне нужно обработать по некой формуле все строчки из таблицы.
А точнее: таблица состоит из:
CREATE TABLE [dbo].[CountHour] (
[Dateandtime] [datetime] NULL ,
[TagIndex] [smallint] NOT NULL ,
[Val] [float] NULL
) ON [PRIMARY]
Сама формула: (DATEANDTIMEn+1 - DATEANDTIMEn)*(VALn + VALn+1) / 2
...
Рейтинг: 0 / 0
Проблема с курсором
    #32031288
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сложно честно говоря не зная, что делают многочисленные вызовы процедур в курсорах понять логику не зная постановки. Что заметил - в процедуре не стоит SET NOCOUNT OFF и SET XACT_ABORT OFF, не стоит обработка возникновения ошибок после вызовов ХП, в конце возвращаются 2 select-а, честно говоря не знаю, в Cristal Report есть возможность получать одновременно с запроса несколько наборов данных (как в АДО) ? Заодно проверьте, что в вызываемых процедурах никто select-ом не возвращает данных, так как они тоже к клиенту попадут.
...
Рейтинг: 0 / 0
Проблема с курсором
    #32031296
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сама формула: (DATEANDTIMEn+1 - DATEANDTIMEn)*(VALn + VALn+1) / 2

А n и n+1 означают текущая и следующая запись что-ли ?
Если бы у таблицы был первичный ключ, то можно было бы сделать в одном запросе.
Хотя и без него можно попробовать

\nCREATE TABLE #CountHour ([Dateandtime] [datetime] NULL , [TagIndex] [smallint] NOT NULL , [Val] [float] NULL )

insert #CountHour values('20020501', 1, 10.5)
insert #CountHour values('20020501 09:30:00', 1, 5.5)
insert #CountHour values('20020501 09:35:00', 1, 15.5)
insert #CountHour values('20020501 15:44:00', 1, 5.5)

insert #CountHour values('20020501 12:12:00', 2, 5.5)
insert #CountHour values('20020501 13:12:00', 2, 45.5)



select a.Dateandtime AS a_Dateandtime, a.Val AS a_Val, b.Dateandtime AS b_Dateandtime, b.val AS b_Val,
DATEDIFF(hh, a.Dateandtime, b.Dateandtime)*(a.Val+b.Val)/2
from
(select a.tagindex, a.Dateandtime, a.Val, (select top 1 b.Dateandtime from #CountHour b where b.tagindex = a.tagindex and b.Dateandtime > a.Dateandtime order by b.Dateandtime asc) as b_Dateandtime
from #CountHour a) AS a
left outer join #CountHour b on b.tagindex = a.tagindex and b.Dateandtime = a.b_Dateandtime

drop table #CountHour
...
Рейтинг: 0 / 0
Проблема с курсором
    #32031378
Paul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за пример Glory. Все получилось.

А вообще можно както блокировать ненужные select из курсоров?
...
Рейтинг: 0 / 0
Проблема с курсором
    #32031381
Paul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А может кто подскажет как решить лучше такую задачу.
Есть таблица:
CREATE TABLE [dbo].[Count] (
[DateAndTime] [datetime] NULL ,
[TagIndex] [smallint] NOT NULL ,
[Val] [float] NULL
) ON [PRIMARY]

Мне нужно подсчитать по формуле: Total = Total + (DATEANDTIMEn+1 - DATEANDTIMEn)*(VALn + VALn+1) / 2, по каждому TagIndex и разбить по времени.
Что бы получилась таблица типа:
CREATE TABLE [dbo].[tb_CountHour] (
[TagIndex] [smallint] NOT NULL ,
[Smena] [float] NULL ,
[Day] [float] NULL ,
[Month] [float] NULL
) ON [PRIMARY]
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблема с курсором
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]