Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
15-1177314606
cj
2007-04-23 11:50
2007.05.27
NTFS-DOS


1-1175530495
DelphiLexx
2007-04-02 20:14
2007.05.27
Из TPageControl сделать аналог TNoteBook a


2-1178708349
Belorus
2007-05-09 14:59
2007.05.27
TShiftState


4-1166780935
Grademax
2006-12-22 12:48
2007.05.27
Как узнать сколько времени отработал HDD?


2-1178790029
zero
2007-05-10 13:40
2007.05.27
Запретить добовление новой строки в DBGridEh





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский