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

Вниз

INSERT в MSSQL   Найти похожие ветки 

 
ST   (2005-04-28 12:23) [0]

Господа, подскажите, можно ли при выполнении INSERT на MSSQL 2000 вытащить полученный автоинкрементом новый индекс записи в одном запросе.


 
Anatoly Podgoretsky ©   (2005-04-28 12:24) [1]

Только после


 
mariya_mezenceva ©   (2005-04-28 12:33) [2]

select IDENT_CURRENT("table_name")


 
Anatoly Podgoretsky ©   (2005-04-28 12:50) [3]

Только не это, рекомендую прочить справку прежде чем подобное советовать.


 
mariya_mezenceva ©   (2005-04-28 12:58) [4]

прекрасно работает
я всегда делаю так
(реализую в хранимой процедуре)
CREATE PROCEDURE pinstable_name
@f varchar(10),
...,
@id int output
AS
insert into table_name(f,...) values (@f,...)
select @id=IDENT_CURRENT("table_name")


 
ANB ©   (2005-04-28 13:01) [5]

insert into table1 (A,B,C) values ("A", "B", "C")
select @@identity as NEW_ID

Все это надо засунуть в одну кверю и выполнять не Execute, а Open. После открытия можно будет прочитать в FieldByName("NEW_ID") добавленный ID. Другие способы некорректны.


 
ANB ©   (2005-04-28 13:03) [6]

IDENT_CURRENT - вернет текущее значение ID, и не факт, что твое, если с таблицей работают часто.


 
msguns ©   (2005-04-28 13:06) [7]

Есть такой немудреный способ:
1. Создается таблица со структурой (#AUTOID)
 TableName  VARCHAR
 CURID      INTEGER
2. Содается ХП, которая делает так
- Блокирует таблицу
- считывает значение CURID из этой таблицы из соотв.записи
- Значение = Значение + 1
- UPDATE счетчику в таблице на Значение
- Разблокирует таблицу
- Возвращает Значение
3. На каждую таблицу БД, где надо счетчик, создается триггер, срабатывающий ДО вставки. Это триггер проверяет значение ID и, если оно NULL, то обращается к указанной процедуре за значением счетчика

В результате ID можно получить на клиенте БЕЗ вставки (точнее ДО). Таким образом можно "обмануть" SQL-Server, "подменив" его фукцию автоинкремента.

Других эффиективных способов получения уникального ID ДО вставки я не знаю, хотя весьма интересовался этой проблемой. В т.ч. и на этом форуме.


 
Anatoly Podgoretsky ©   (2005-04-28 13:11) [8]

mariya_mezenceva ©   (28.04.05 12:58) [4]
прекрасно работаешь над разрушением логической целостности базы.


 
ANB ©   (2005-04-28 15:40) [9]


> msguns ©   (28.04.05 13:06) [7]
- читай топик ("до" не надо, нужен аналог ретурнинг Oracle).


> Таким образом можно "обмануть" SQL-Server,
- не надо его обманывать. В нем есть штатные функции для этих целей. А это изгал.


 
msguns ©   (2005-04-28 15:56) [10]

>ANB ©   (28.04.05 15:40) [9]
>- читай топик ("до" не надо, нужен аналог ретурнинг Oracle).

С этим согласен.

>- не надо его обманывать. В нем есть штатные функции для этих целей. А это изгал.

С этим нет. Не надо заставлять всех ходить в таких же тапочках, как у тебя. Не взирая на погоду и мозоли ;)


 
ANB ©   (2005-04-28 16:07) [11]


> Не взирая на погоду и мозоли ;)
- твой способ набъет мозоли юзеру. Зачем изобретать велосипед, если он уже изобретен ? Фактически, ты предлагаешь не использовать автоинкрементальные поля. А если они уже есть в базе и убрать ты их не имеешь права ?
Хе, видел давеча хохму : таблица в MS SQL с единственным полем - автоинкрементальным ID. Интересно, как на нее инсерт написать ?


 
msguns ©   (2005-04-28 16:28) [12]

>ANB ©   (28.04.05 16:07) [11]
>- твой способ набъет мозоли юзеру.

Каким образом, если не секрет ?

>Фактически, ты предлагаешь не использовать автоинкрементальные поля.

Я это предлагал ?


 
ANB ©   (2005-04-28 16:46) [13]


> Я это предлагал ?
а как ты проинсертишь запись с этим сгенеренным ID ? Инсерт в студию !


 
ANB ©   (2005-04-28 16:52) [14]


> msguns ©   (28.04.05 16:28) [12]
- слушай, а чего это мы с тобой бодаемся, если автор топика давно свалил ?


 
Max Zyuzin ©   (2005-04-28 17:03) [15]

>ANB ©   (28.04.05 16:52) [14]
Я вот согласен с msguns ©   (28.04.05 13:06) [7] тоже порылся по форумам, почитал макулатуру, и решил что это и есть самый оптимальный способ.


 
ANB ©   (2005-04-28 17:09) [16]


> Max Zyuzin ©   (28.04.05 17:03) [15]
- см.

> ANB ©   (28.04.05 16:46) [13]


 
Fay ©   (2005-04-28 17:10) [17]

Max Zyuzin ©   (28.04.05 17:03) [15]
Где это Вы видели триггеры BEFORE в MSSQL?!


 
ANB ©   (2005-04-28 17:15) [18]


> Fay ©   (28.04.05 17:10) [17]
триггера на таблицы в MS SQL в принципе BEFORE и есть . . . А разве не так ?


 
Max Zyuzin ©   (2005-04-28 17:19) [19]

>ANB ©   (28.04.05 17:09) [16]
Я про триггеры и не говорил, я вообще использую такую конструкцию только для добавления в master-detail на "лету", что бы все добавлялось в одной быстрой транзакции, я сначала получаю ID master-а вышеуказаным способом, потом в одной транзакции все толкаю сразу в обе таблицы, вот.


 
ANB ©   (2005-04-28 17:22) [20]


> Max Zyuzin ©   (28.04.05 17:19) [19]
- ты не понял вопроса, как ты засовываешь свой сгенеренный ID в таблицу ? Если у нее ID автоинкрементальный ?


 
Max Zyuzin ©   (2005-04-28 17:27) [21]

>ANB ©   (28.04.05 17:22) [20]
ID в таблицы типа BigInt и усе... никаких Identity. Все "автоинкрементирование" виртуальное... на уровне приложения осуществляется, я понимаю что это ни есть гуд, только вот другого способа я так и не нашел...


 
ANB ©   (2005-04-28 17:42) [22]


> Max Zyuzin ©   (28.04.05 17:27) [21]
- топик читал ? Поле уже автоинкрементальное.

> другого способа я так и не нашел...
- select @@identity - это и есть нормальный способ. Мне его ребята в РНИВЦ в Нижнем подсказали. Я до этого сам максом последний ID доставал.
И не всегда ты имеешь право перепроектировать БД. Плюс, тебе придется либо генерить ID уникальный по всей базе (что не плохо, но на каждой операции у тебя все клиенты будут ждать разблокировки служебной таблицы), либо заводить эту таблицу для каждой таблицы с данными. Тогда проще max юзать и саму таблицу с данными блокировать.


 
Johnmen ©   (2005-04-28 17:43) [23]

Мои три копейки - так и только так : ANB ©   (28.04.05 13:01) [5]
Обсуждение альтернативных "рукоёмких" способов неуместно, ИМХО.


 
ANB ©   (2005-04-28 17:49) [24]


> Johnmen ©   (28.04.05 17:43) [23]
- почему, я лично предпочитаю юзать сиквенсы или GUID. Но по данному топику другого ответа действительно нет.


 
Fay ©   (2005-04-28 18:04) [25]

ANB ©   (28.04.05 17:15) [18]
AFTER


 
ANB ©   (2005-04-29 09:31) [26]


> Fay ©   (28.04.05 18:04) [25]
> ANB ©   (28.04.05 17:15) [18]
> AFTER
- то есть срабатывает после инсерта ? Быть такого не может. А как же тогда подменять поля при необходимости ? Прямо табличку апдейтить ? И опять на триггер нарываться ? У тебя стоит MS SQL ? Если да, то слазий в хелп, плз, а то у меня его сейчас нет.


 
Johnmen ©   (2005-04-29 09:51) [27]

>ANB ©   (29.04.05 09:31) [26]

CREATE TRIGGER trigger_name
...
{{{ FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] }
...


 
ANB ©   (2005-04-29 10:34) [28]


> Johnmen ©   (29.04.05 09:51) [27]
- это ты для MS SQL выдрал ? Интересно, зачем им триггера AFTER, они же с наборами данных работают deleted и inserted . . . Да ладно, не принципиально. Получается что BEFORE таки есть. Один хрен, для автоинкрементального поля ID в триггере не подменишь.


 
Polevi ©   (2005-04-29 10:56) [29]

>ANB ©   (29.04.05 10:34) [28]
достал ты уже своим невежеством, изучи сервер сначала а потом советы давай
начальник ему плохой посоветовал.. дадад
начни со своего вопроса в [11]


 
ANB ©   (2005-04-29 11:04) [30]


> начни со своего вопроса в [11]
- это был не мой вопрос.


 
ANB ©   (2005-04-29 11:06) [31]


> достал ты уже своим невежеством
- и чего я неправильно насоветовал ?


> начальник ему плохой посоветовал.. дадад
- и где тут про начальника ?


 
Polevi ©   (2005-04-29 11:19) [32]

>таблица в MS SQL с единственным полем - автоинкрементальным ID. >Интересно, как на нее инсерт написать ?

про начальника в другой ветке


 
ANB ©   (2005-04-29 11:22) [33]


> про начальника в другой ветке
- а так это я только неделю как работать начал. И у нас и правда такая фигня была - даже новую кнопку на форме нужно было согласовывать. То есть, сначала делаешь как велели (и по барабану, как работает), а потом можешь внести свои предложения.


> >Интересно, как на нее инсерт написать ?
- ну и как (не отключая автоинкрементарность) ?


 
Polevi ©   (2005-04-29 13:24) [34]

insert into sometable default values


 
Fay ©   (2005-04-29 13:36) [35]

Polevi ©   (29.04.05 13:24) [34]
Спасибо за поддержку. Почему-то большинство людей не верит в то, что я говорю 8)


 
Polevi ©   (2005-04-29 13:39) [36]

>Fay ©   (29.04.05 13:36) [35]
ты обращайся если что :-)


 
ANB ©   (2005-04-29 13:53) [37]


> Polevi ©   (29.04.05 13:24) [34]
- круто. Я этого не нашел. В этой же базе была еще табличка с автоинкрементальным ID и пустым полем (всегда null). Мы сначала прикалывались после Oracle - зачем это. Потом дошло, что это для инсерта поле добавили. А потом разработчики, похоже, узнали про default values и родили табличку с одним ID. И мы ломали голову, как в нее теперь инсертят. Теперь понятно.


 
Stanislav ©   (2005-04-29 14:09) [38]

ST   (28.04.05 12:23)  
Тебе нужно после инсерта узнать номер записи которую ты вставил ?


 
Polevi ©   (2005-04-29 14:23) [39]

да, № п/п
как в накладной


 
Stanislav ©   (2005-04-29 14:36) [40]

А так:
Insert ...
select max(id) from mytable ?



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

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

Наверх




Память: 0.56 MB
Время: 0.05 c
3-1114444902
Jungle Forever!
2005-04-25 20:01
2005.06.06
DBGrid и unixtime


3-1114873152
DIS
2005-04-30 18:59
2005.06.06
master-detail SQLзапрос


3-1114512640
Le!
2005-04-26 14:50
2005.06.06
Подключение к серверу!!


14-1116425627
Maverick
2005-05-18 18:13
2005.06.06
Каким инсталятором вы пользуетесь?


6-1111262919
CAMCOH
2005-03-19 23:08
2005.06.06
Программная смена IP в windows xp