Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Генератор в MSSQL. Бьюсь уже 2-а дня. [MSSQL]


Страницы:   1 2

DmitrichJ ©   (2007-03-07 14:12:00) 

Добрых суток, мастера.Уже 2 дня тем и занимаюсь чтением sql.ru для того чтобы сделать элементарную задачу. Генератор на подобии в InterBase, но ничего не получается.

Задача сделать уникальное значение ID для добавлении записи в нескоко таблиц.

Дошёл до того, что создал процедуру:
CREATE PROC GEN_ID
@org VARCHAR (200),
@tporg VARCHAR (200),
@vid_deiat VARCHAR (200),
@rot INT,
@reiting INT,
@metro VARCHAR (200),
@adres VARCHAR (200),
@prim VARCHAR (200),
@NewID INT OUTPUT
AS
  INSERT INTO ORGANIZATION(ORG,TPORG,VID,ROT,REITING,METRO,ADRES,PRIM)
                    VALUES(@org,@tporg,@vid_deiat,@rot,@reiting,@metro,@adres,@prim)
  SET @NewID = SCOPE_IDENTITY()
GO

для того чтобы после вставки записи получить последнее значение IDENTITY, но немогу подключить процедуру через StoredProc1!!! Пишет, что не может найти процедуру, хотя одключаю к БД правильно, и он определяет все переменные верно.

В общем спасите!


Johnmen   (2007-03-07 20:20:00) [1]


> DmitrichJ   (07.03.07 14:12) 

Могу сказать одно.
Любое решение "а-ля генератор" через таблицы - НИКАКОЙ гарантии уникальности и автоинкрементности. Ибо генераторы вне контекста транзакций не зависимо от того, кем они поддерживаются, клиентом или сервером.


Stanislav   (2007-03-07 16:27:00) [2]

sniknik ©   (07.03.07 16:15) [27]
тригер только не "for insert" , а "INSTEAD OF  INSERT", который выполняется вместо инсерта
Сначала в нем наполняем таблицу генератор
Потом таблицу, на которую установлен триггер, уже со значениями из таблицы генератора.
Я правда такой генератор неделал, но думаю получится.


Val   (2007-03-07 16:17:00) [3]

>[24] Stanislav ©   (07.03.07 16:10)
заменяется циклом по курсору о вставкой по одной записи в хп.
а проблемы на филейную часть при целеустремленном поиске находятся на ура :)


sniknik   (2007-03-07 16:15:00) [4]

Stanislav ©   (07.03.07 16:10) [24]
а в тригере значение присваивать не пробовали? (не уверен пройдут/разрешены там инсерты...)


Stanislav   (2007-03-07 16:14:00) [5]

DmitrichJ   (07.03.07 16:12) [25]
вообще это можно реализовать в триггере, но очень геморно.


DmitrichJ   (2007-03-07 16:12:00) [6]

sniknik, хм.... думаю я это учту в следующем проекте, а то сроки поджимают уже.


Stanislav   (2007-03-07 16:10:00) [7]

sniknik ©   (07.03.07 16:04) [20]
Val ©   (07.03.07 16:05) [22]
Правильно.
Так тоже ког-да то делали генераторы, задача не подразумевала массовых вставок, пока юзера не попросили кнопку копирования данных предыдущего периода, с изменением только месяца.


sniknik   (2007-03-07 16:10:00) [8]

DmitrichJ   (07.03.07 16:02) [19]
нда уж... нет, основы всетаки необходимы... любую книжку про mssql.

DECLARE @ID INT
EXEC GEN_ID @ID OUTPUT
...insert into table1 (...) values (@ID,...)
и никаких "перегонов" значений через клиента.


Val   (2007-03-07 16:05:00) [9]

сорри, "имел ввиду", конечно же.


Val   (2007-03-07 16:05:00) [10]

он имел массовую вставку набора данных, возвращаемого вложенным селектом.


sniknik   (2007-03-07 16:04:00) [11]

Stanislav ©   (07.03.07 15:48) [17]
а... понял. имеется ввиду, если нужно разные значения, типа как от автоинкремента... тогда да, облом`с, а вот с функцией бы получилось. ;о)


DmitrichJ   (2007-03-07 16:02:00) [12]

10 записей одним запросом? Может я что-то не понимаю...

Я создал в MSSQL твою процедурку.
И в Delphi функцию:

Function new_id:integer;
begin
 MainForm.QueryGen.SQL.Text:=
   'DECLARE @ID INT'+#13+
   'EXEC GEN_ID @ID OUTPUT'+#13+
   'SELECT @ID';
 mainform.QueryGen.Active:=true;
 new_id:=mainform.QueryGen.Fields[0].AsInteger;
end;

Когда пользователю нужно добавить запись, вызывается, например, NpOrg:=new_id

...insert into table1 (...) values ((inttostr(NpOrg),...)
...insert into table2 (...) values ((inttostr(NpOrg),...)

Не best, но довольно удобно.


sniknik   (2007-03-07 16:01:00) [13]

Stanislav ©   (07.03.07 15:48) [17]
вместо ??? -> @ID, который чуть ранее получили, парой команд до инсерта...


Stanislav   (2007-03-07 15:48:00) [14]

DmitrichJ   (07.03.07 15:40) [16]
Интересно если тебе понадобится вставить в твою таблицу 10 записей одним  запросом, что тогда?
Insert into mytable (field_id,field1, field2..fieldn)
select ???, field1, field2..fieldn from mytable2


DmitrichJ   (2007-03-07 15:40:00) [15]

Val, я могу ему помочь...

sniknik, ОГРОМНЕЙШЕЕ СПАСИБО!!! РАБОТАЕТ!!!!
Теперь буду тестить.
Надеюсь в сети с многими клиентами этот способ будет себя хорошо вести.


sniknik   (2007-03-07 15:36:00) [16]

откуда я знаю? это твоя идея получить "сквозной" автоинкремент, на несколько таблиц. вот в @ID мы его получили, дальше тебе решать.
хочеш в красивой рамочке в программе выводи... хочеш игнорируй, а хочеш используй как значения для тех самых таблиц для которых была идея его получит.


Val   (2007-03-07 15:36:00) [17]

offtop:
тут у меня в аське один как раз обратным занимается :) пытается автоинкрементное поле в иб создать, потому как в мсскл так. литературу читать, похоже, тоже отказывается :)


Stanislav   (2007-03-07 15:34:00) [18]

ADODataSet нужно использовать


DmitrichJ   (2007-03-07 15:28:00) [19]

sniknik, можно тогда чуть подробней что делать со второй частью? т.е. вызовом
DECLARE @ID INT
EXEC GEN_ID @ID OUTPUT
SELECT @ID


sniknik   (2007-03-07 15:24:00) [20]

> в Query писать?
ничего. выбрось Query, выбрось BDE, используй ADO, а в адо не используй теже ADOTable/Query/StoredProc.

(использование указанного (типа BDE для MSSQL) уже не просто "криво", а принципиально неверно..., а заведомо неверные ответы я не даю)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо