Форум: "Базы";
Текущий архив: 2007.05.27;
Скачать: [xml.tar.bz2];
ВнизГенератор в 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.042 c