Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.27;
Скачать: CL | DM;

Вниз

Генератор в MSSQL. Бьюсь уже 2-а дня.   Найти похожие ветки 

 
DmitrichJ   (2007-03-07 14:12) [0]

Добрых суток, мастера.Уже 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!!! Пишет, что не может найти процедуру, хотя одключаю к БД правильно, и он определяет все переменные верно.

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


 
Плохиш ©   (2007-03-07 14:42) [1]


> для того чтобы после вставки записи получить последнее значение
> IDENTITY, но немогу подключить процедуру через StoredProc1!

Значит создаёшь подключение к другой базе данных...


 
DmitrichJ   (2007-03-07 14:49) [2]

Плохиш, в StoredProc.DataBaseName указываю имя БД правильно, В StoredProcName имя процедуры видит нормально dbo.Gen_id;1, параметры все видит, но при выполнении говорит, что не может найти.


 
stud ©   (2007-03-07 14:52) [3]

тогда текст ошибки давай, компаненты доступа и т.п.


 
DmitrichJ   (2007-03-07 15:05) [4]

Delphi 2006,BDE:
   MainForm.StoredProc1.DatabaseName:="iren_76";
   MainForm.StoredProc1.StoredProcName:="GEN_ID;1";
   MainForm.StoredProc1.Params[1].ParamType:=ptInput;//@org
   ...
   MainForm.StoredProc1.Params[9].ParamType:=ptOutput;//@new_id
  // ну или всё это только в компоненте

   MainForm.StoredProc1.ExecProc;

  Ошибка:Cuold not find stored proceddure "dbo.GEN_ID;1"


 
DmitrichJ   (2007-03-07 15:09) [5]

Проблема больше не в процедуре, а в задаче. Можно ли решить это без процедур и функций?


 
Правильный Вася   (2007-03-07 15:10) [6]

автор DmitrichJ а база iren_76


 
sniknik ©   (2007-03-07 15:13) [7]

> Генератор на подобии в InterBase
вообще "кривая" задача, логика mssql отлична от IB, а писать надо в соответствии с той что у используемого...

ну а на "кривую" логику кривое же и решение... ;о))
сначала делаешь таблицу типа аналог переменной генератора в ib (ну нет в MSSQL подобных)

CREATE TABLE ValGenID (ID INT Identity(1, 1))

создаешь процедуру (лучше бы конечно функцию, удобнее былобы, но там есть ограничения... вроде бы в 2005м можно/обходятся, только я к примеру все еще 2000 использую)

CREATE PROCEDURE GEN_ID
@NewID INT OUTPUT
AS
SET NOCOUNT ON
INSERT INTO ValGenID DEFAULT VALUES
SELECT @NewID=@@Identity
DELETE FROM ValGenID
SET NOCOUNT OFF

используешь

DECLARE @ID INT
EXEC GEN_ID @ID OUTPUT
SELECT @ID
сдесь просто вывод(select) полученного, но можно и в пакет с инсертом добавлять... использовать полученное значение в нем. (была бы функция было бы INSERT INTO .... VALUES (GEN_ID(), ....), просто мечта! ;))

> но немогу подключить процедуру через StoredProc1!!!
клево. и правильно. не используй StoredProc... (в принципе можно предположить почему... разобраться. но зачем сломанному "костылику" дощечки набивать, ремонт делать? проще выкинуть)


 
DmitrichJ   (2007-03-07 15:13) [8]

Это база для организации iren.


 
DmitrichJ   (2007-03-07 15:20) [9]

sniknik, я в этом деле новенький....

Это
DECLARE @ID INT
EXEC GEN_ID @ID OUTPUT
SELECT @ID
в Query писать?


 
Stanislav ©   (2007-03-07 15:23) [10]

"GEN_ID;1" нужно  GEN_ID


 
sniknik ©   (2007-03-07 15:24) [11]

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

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


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

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


 
Stanislav ©   (2007-03-07 15:34) [13]

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


 
Val ©   (2007-03-07 15:36) [14]

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


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

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


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

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

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


 
Stanislav ©   (2007-03-07 15:48) [17]

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


 
sniknik ©   (2007-03-07 16:01) [18]

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


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

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:04) [20]

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


 
Val ©   (2007-03-07 16:05) [21]

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


 
Val ©   (2007-03-07 16:05) [22]

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


 
sniknik ©   (2007-03-07 16:10) [23]

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

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


 
Stanislav ©   (2007-03-07 16:10) [24]

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


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

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


 
Stanislav ©   (2007-03-07 16:14) [26]

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


 
sniknik ©   (2007-03-07 16:15) [27]

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


 
Val ©   (2007-03-07 16:17) [28]

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


 
Stanislav ©   (2007-03-07 16:27) [29]

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


 
Johnmen ©   (2007-03-07 20:20) [30]


> DmitrichJ   (07.03.07 14:12) 

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



Страницы: 1 вся ветка

Текущий архив: 2007.05.27;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.032 c
11-1160141707
Zoom Evstrahiev
2006-10-06 17:35
2007.05.27
Зеркало для KOLCoolBar


2-1178548742
Regent
2007-05-07 18:39
2007.05.27
Диалог


15-1177505791
palva
2007-04-25 16:56
2007.05.27
Геометрическая задача


15-1178004231
antonn
2007-05-01 11:23
2007.05.27
хранение постов форума


1-1175258646
MZ
2007-03-30 16:44
2007.05.27
Заголовок MDI формы