![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Генератор в MSSQL. Бьюсь уже 2-а дня. [MSSQL]
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) уже не просто "криво", а принципиально неверно..., а заведомо неверные ответы я не даю)