powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / проблема с курсором
8 сообщений из 8, страница 1 из 1
проблема с курсором
    #32024821
pq16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прошу помощи! Я до последнего момента и близко не подходил к SQL БД. Но жизнь заставила. Пытаюсь самостоятельно справиться.
Суть проблемы: есть две таблицы, в одной хранятся аналоговые значения переменных а в другой дискретные.
Вот их структура AnalogHistory и DiscretHistory:
DateTime / TagName / Value(в первой аналог, во второй дискрет)
Я создал таблицу Tab3 с полями
DateTime / Tag1 / Tag2 / …. / Tag30 (это строки из поля Tagname таблиц Таб1 и Таб2 аналоговые или дискретные)

Написал процедуру которая должна считывать имена полей Таб3, определять их тип(datetime, real , tinyint.) и в зависимости от типа проводить выборку из таблицы аналоговых или дискретных значений value и вставлять эти значения в Тав3 определенному полю Tag.
Вот такой монстр получился.
Выборка производится во временном интервале.

CREATE PROCEDURE SelectTabl
@TablName varchar(30),
@SD varchar(35), «начальное время»
@ED varchar(35) «конечное»

AS
BEGIN


DECLARE @ColName varchar(200),
@ColType tinyint,
@ColList varchar(255),
@StartDate datetime,
@EndDate datetime

SELECT @StartDate=CONVERT(datetime,@SD,100)
SELECT @EndDate=CONVERT(datetime,@ED,100)


DECLARE Tabcursor CURSOR FOR SELECT name,type FROM syscolumns
WHERE id=(SELECT id FROM sysobjects WHERE type='u' AND name=@TablName)
FOR READ ONLY « здесь определяется имя поля и его тип»
OPEN Tabcursor
FETCH NEXT FROM Tabcursor INTO @ColName,@ColType
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
SELECT @ColName = RTRIM(@ColName)

IF (@ColType = 109) «тип real»
EXECUTE ("INSERT INTO "+@TablName+" ("+@ColName+") SELECT Value FROM AnalogHistory WHERE DateTime >= "+@StartDate+" AND DateTime <= "+@EndDate+" AND TagName = "+@ColName)
IF (@ColType = 3 «тип tinyint»
EXECUTE ("INSERT INTO "+@TablName+" ("+@ColName+") SELECT Value FROM DiscreteHistory WHERE DateTime >= "+@StartDate+" AND DateTime <= "+@EndDate+" AND TagName = "+@ColName)
IF (@ColType = 61) «тип datetime»
EXECUTE ("INSERT INTO "+@TablName+" ("+@ColName+") SELECT DateTime FROM AnalogHistory WHERE DateTime >= "+@StartDate+" AND DateTime <= "+@EndDate)
END
FETCH NEXT FROM Tabcursor INTO @ColName,@ColType
END
CLOSE Tabcursor
DEALLOCATE Tabcursor
END
GO
Я отдельно проверял выборку и вставку в таблицу все работает но в курсоре не хочет. Что то я не так наверное с курсором делаю у меня совсем нет опыта в этом.
Процедуру составил по документации да в нете кое чего подсмотрел.
Подскажите чего я сделал не так.!!
...
Рейтинг: 0 / 0
проблема с курсором
    #32024830
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то я не так наверное с курсором делаю
Скорее не с курсором а с динамическим запросом. Ну нельзя же так просто "склеивать" данные разных типов
...WHERE DateTime >= "+@StartDate+" AND ...

IMHO так лучше


CREATE PROCEDURE SelectTabl
@TablName varchar(30),
@SD varchar(35),
@ED varchar(35)

AS

DECLARE @ColName varchar(200),
@ColType tinyint,
@ColList varchar(255)

DECLARE Tabcursor CURSOR FOR SELECT column_name, data_type from INFORMATION_SCHEMA.COLUMNS where table_name = @TablName FOR READ ONLY
OPEN Tabcursor
FETCH NEXT FROM Tabcursor INTO @ColName,@ColType

WHILE (@@fetch_status = 0)
BEGIN

IF (@ColType = 'real') OR (@ColType = 'tinyint')
EXECUTE ('INSERT INTO '+@TablName+' ('+@ColName+') SELECT Value FROM AnalogHistory
WHERE DateTime BETWEEN CONVERT(datetime,'''+@SD+''',100) AND CONVERT(datetime,'''+@ED+''',100) AND TagName = '''+@ColName+'''')
ELSE IF @ColType = 'datetime'
EXECUTE ('INSERT INTO '+@TablName+' ('+@ColName+') SELECT DateTime FROM AnalogHistory
WHERE DateTime BETWEEN CONVERT(datetime,'''+@SD+''',100) AND CONVERT(datetime,'''+@ED+''',100)')

FETCH NEXT FROM Tabcursor INTO @ColName,@ColType
END
CLOSE Tabcursor
DEALLOCATE Tabcursor


ЗЫ
Если вы будете в качестве стрингового представления типа datetime использовать формат yyyymmdd hh:mm:ss, то это избавит вас от дополнительных принудительных конвертаций типов. И конкрентно в данном примере можноо будет в динамическом запросе отказатьбся от функции CONVERT.

Указывайте в вопросе на всякий случай версию своего сервера, а также полное оригинальное сообщение об ошибке.
...
Рейтинг: 0 / 0
проблема с курсором
    #32024831
pq16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спосибо за ответ!
я совсм забыл указать, что использую SQL6.5
а ошибки при выполнении процедуры не было просто писал, что эта процедура невыводит ни каких данных.
...
Рейтинг: 0 / 0
проблема с курсором
    #32024836
pq16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да и еще динамический запрос
EXECUTE ("INSERT INTO "+@TablName+" ("+@ColName+") SELECT Value FROM AnalogHistory WHERE DateTime >= "+@StartDate+" AND DateTime <= "+@EndDate+" AND TagName = "+@ColName)
у меня работает я его проверял отдельно
...
Рейтинг: 0 / 0
проблема с курсором
    #32024837
pq16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да и еще динамический запрос
EXECUTE ("INSERT INTO "+@TablName+" ("+@ColName+") SELECT Value FROM AnalogHistory WHERE DateTime >= "+@StartDate+" AND DateTime <= "+@EndDate+" AND TagName = "+@ColName)
у меня работает я его проверял отдельно
что означает строчка from INFORMATION_SCHEMA.COLUMNS по мойму этого нет в SQL 6.5
...
Рейтинг: 0 / 0
проблема с курсором
    #32024838
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а цикл-то по курсору выполняется хоть один-то раз ?
...
Рейтинг: 0 / 0
проблема с курсором
    #32024842
pq16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
не могу точно сказать возможно ивполнялся но данные в таблицу не вставлял
...
Рейтинг: 0 / 0
проблема с курсором
    #32024845
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO если не всталяются записи, то значит не доходит до выполнения динамического запроса, а значит
- либо не выполняется WHILE (@@fetch_status <> -1), т.е. в курсоре нет ни одной записи
- либо не выполняется IF (@@fetch_status <> -2), т.е. ошибка при чтении курсора
- либо не выполняется ни один из IF (@ColType = ...), т.е. в курсоре нет полей нужного вам типа

Проверяйте.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / проблема с курсором
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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