Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите написать функцию  [new]
sanitar
Member

Откуда:
Сообщений: 66
Есть база, в которой каждый день формируется
таблица логов с именем LGYYMMDD, вот скрипт для создания одной из них:

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Lg031127]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Lg031127]
GO

CREATE TABLE [dbo].[Lg031127] (
[IdPar] [smallint] NULL ,
[IdObj] [smallint] NULL ,
[TypeObj] [smallint] NULL ,
[Data] [datetime] NULL ,
[ParType] [smallint] NULL ,
[ParReal] [float] NULL ,
[DataOld] [datetime] NULL ,
[Del] [bit] NULL ,
[Period] [smallint] NULL ,
[ChangeTime] [float] NULL
) ON [PRIMARY]
GO

семантический смысл таков - есть некий объект (IdObj), по которому фиксируются в реальном времени его параметры (IdPar).
Задача заключается в том чтобы заполнить следующие поля таблицы одним запросом
(IdPar /*параметр*/,IdObj /*объект*/,Data/*дата и время прихода значения*/,ParReal/*значение*/,DataOld/*дата и время прихода предыдущего значения этого же параметра по этому же объекту*/)
Проблема заключается с полем DataOld. Хотел написать функцию возвращающую это значение, но т.к. запрос получается динамический, поскоку имя таблицы заранее неизвестно, то ничего не получилось.
Подскажите плз красивое решение данной проблемы без триггеров.
19 апр 04, 08:35    [635106]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
Проходящий_мимо
Member

Откуда: Москва
Сообщений: 50
База данных АДКУ ??))

Параметр может ведь располагаться не в этой таблице а в одной из предыдущих.

подробнее могу отписать мэйлом
ICQ 7513230 mailto:xwarlock@mail.ru
19 апр 04, 08:43    [635114]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
aleks2
Guest
Самое красивое:

1) Лог вести в ОДНОЙ таблице, добавив поле
[LogDay] char(8) NOT NULL,
куда и заносить 'LGYYMMDD' для различения разных логов.

2) Не заполнять поле DateOld. Состряпать вместо этого View (представление), где заполнить это поле. Либо сделать DateOld вычисляемым полем.
19 апр 04, 08:47    [635118]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
sanitar
Member

Откуда:
Сообщений: 66
нельзя ниче стряпать, т.к. база не моя, моя задача только значения залить
19 апр 04, 09:23    [635158]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
Green2
Member

Откуда: skype: green2x2
Сообщений: 13748
Разработчика такой базы на мыло!

2 sanitar

А например слить все в одну таблицу, как советует aleks2, и там уже вычислить ту Ld*** и создать её типа
exec 'select * into lg' + @logday + ' from ld where LogDay=' + @logday
19 апр 04, 09:36    [635170]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
aleks2
Guest
>>нельзя ниче стряпать, т.к. база не моя, моя задача только значения залить

Сочувствую...
Тогда решение только одно:
Клиент, заносящий данные (т.е. ТЫ), должен выполнить соответствующее действо: найти пред. запись и записать с нее Date в DateOld. Это можно оформить по разному, но суть дела не изменится.
19 апр 04, 10:15    [635252]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать функцию  [new]
Glory
Member

Откуда:
Сообщений: 104760
Подскажите плз красивое решение данной проблемы без триггеров.

Если таблицы имеют одинаковую структуру, то можно составить из них представление, в котором объединить их все через UNION ALL.
Если есть возможность добавить в каждую таблицу символьный столбец с конкретным значением YYMMDD для каждой таблицы, то получился бы полноценный partitioned view
19 апр 04, 10:21    [635258]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить