Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
проблема с курсором
|
|||
|---|---|---|---|
|
#18+
Прошу помощи! Я до последнего момента и близко не подходил к 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 Я отдельно проверял выборку и вставку в таблицу все работает но в курсоре не хочет. Что то я не так наверное с курсором делаю у меня совсем нет опыта в этом. Процедуру составил по документации да в нете кое чего подсмотрел. Подскажите чего я сделал не так.!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2002, 08:41 |
|
||
|
проблема с курсором
|
|||
|---|---|---|---|
|
#18+
Что то я не так наверное с курсором делаю Скорее не с курсором а с динамическим запросом. Ну нельзя же так просто "склеивать" данные разных типов ...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. Указывайте в вопросе на всякий случай версию своего сервера, а также полное оригинальное сообщение об ошибке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2002, 09:46 |
|
||
|
проблема с курсором
|
|||
|---|---|---|---|
|
#18+
спосибо за ответ! я совсм забыл указать, что использую SQL6.5 а ошибки при выполнении процедуры не было просто писал, что эта процедура невыводит ни каких данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2002, 09:53 |
|
||
|
проблема с курсором
|
|||
|---|---|---|---|
|
#18+
да и еще динамический запрос EXECUTE ("INSERT INTO "+@TablName+" ("+@ColName+") SELECT Value FROM AnalogHistory WHERE DateTime >= "+@StartDate+" AND DateTime <= "+@EndDate+" AND TagName = "+@ColName) у меня работает я его проверял отдельно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2002, 10:24 |
|
||
|
проблема с курсором
|
|||
|---|---|---|---|
|
#18+
да и еще динамический запрос 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2002, 10:26 |
|
||
|
проблема с курсором
|
|||
|---|---|---|---|
|
#18+
Ну а цикл-то по курсору выполняется хоть один-то раз ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2002, 10:26 |
|
||
|
проблема с курсором
|
|||
|---|---|---|---|
|
#18+
не могу точно сказать возможно ивполнялся но данные в таблицу не вставлял ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2002, 11:02 |
|
||
|
проблема с курсором
|
|||
|---|---|---|---|
|
#18+
IMHO если не всталяются записи, то значит не доходит до выполнения динамического запроса, а значит - либо не выполняется WHILE (@@fetch_status <> -1), т.е. в курсоре нет ни одной записи - либо не выполняется IF (@@fetch_status <> -2), т.е. ошибка при чтении курсора - либо не выполняется ни один из IF (@ColType = ...), т.е. в курсоре нет полей нужного вам типа Проверяйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.03.2002, 11:16 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32024831&tid=1823613]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
85ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 435ms |

| 0 / 0 |
