Главная страница
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 ?


 
Polevi ©   (2005-04-29 14:42) [41]

>Stanislav ©   (29.04.05 14:36) [40]
даже не смешно, умолкни


 
Stanislav ©   (2005-04-29 14:47) [42]

Polevi ©   (29.04.05 14:42) [41]
Непонял ???


 
Polevi ©   (2005-04-29 14:48) [43]

я понял что ты не понял


 
msguns ©   (2005-04-29 15:01) [44]

>Stanislav ©   (29.04.05 14:47) [42]
>Непонял ???

Всю ветку в лом прочесть ?


 
Stanislav ©   (2005-04-29 15:02) [45]

Помоему тебе пора замолкнуть, кокого ты вообще в эту ветку встрял и не одного дельного совета человеку.
И кто тебе мастера дал?


 
Stanislav ©   (2005-04-29 15:05) [46]

msguns ©   (29.04.05 15:01) [44]
А я ее прочел и что?


 
ANB ©   (2005-04-29 15:05) [47]

Гы гы. Ща кто то в орешник влетит.


 
msguns ©   (2005-04-29 15:23) [48]

>Stanislav ©   (29.04.05 15:05) [46]
>А я ее прочел и что?

А то, что так :

>Stanislav ©   (29.04.05 14:36) [40]
А так:
Insert ...
select max(id) from mytable ?


писать нельзя.


 
Stanislav ©   (2005-04-29 15:33) [49]

msguns ©   (29.04.05 15:23) [48]
Я так понимаю человеку нужно узнать ID записи,которая была вставлена командой Insert.
И что неправильно в моем запросе ???


 
msguns ©   (2005-04-29 15:39) [50]

>Stanislav ©   (29.04.05 15:33) [49]
>Я так понимаю человеку нужно узнать ID записи,которая была вставлена командой Insert.

Если бы вопрос стоял так, то исчерпывающий ответ дан в [5]. А дальше обсуждалась еще пущенная мною (а зря) идея о получении ID до вставки и даже без. Просто это довольно часто поднимаемая трабла, единого решения которой до сих пор нет, как вариант почитай посты Max Zyuzin ©


 
ANB ©   (2005-04-29 15:52) [51]


> идея о получении ID до вставки и даже без.
- у меня есть на идея :))) Переходи на Oracle. Там сиквенсы есть. И никаких проблем.


 
Stanislav ©   (2005-04-29 15:53) [52]

Ну, вот. А я давал ответ на вопрос поставленный ST см. [38],
как альтернатива [5]. Если это будет выполнятся одной х.п.,то 100% он узнает правильный ID.
А остальное уже отклонение от темы. А появление Polevi в этой ветке вообще глупо.


 
Max Zyuzin ©   (2005-04-29 15:58) [53]

Ну вы еще подеритесь...
>Stanislav ©   (29.04.05 15:53) [52]
Конструкция типа [40] не верна упринципе идеологически, ибо MSSQL это вам не однопользовательский парадокс.


 
Polevi ©   (2005-04-29 16:03) [54]

>Max Zyuzin ©   (29.04.05 15:58) [53]

г. Stanislav © имеет большой опыт работы с сервером от Microsoft
после >Stanislav ©   (29.04.05 14:36) [40] рождается миф от msguns "Тяжела как беременная свинья, что в инстале, что в работе"


 
Stanislav ©   (2005-04-29 16:06) [55]

Также как и [5].
Зачем узнавать значение  ID до ?


 
msguns ©   (2005-04-29 16:09) [56]

>Max Zyuzin ©   (29.04.05 15:58) [53]
>это вам не однопользовательский парадокс.

Ой ля-ля ?


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

>Polevi ©   (29.04.05 16:03) [54]
>рождается миф от msguns "Тяжела как беременная свинья, что в инстале, что в работе"

Если б миф..

>Stanislav ©   (29.04.05 16:06) [55]
>Также как и [5].
>Зачем узнавать значение  ID до ?

В принципе незачем. Если можно узнать ВМЕСТЕ. Я, к примеру, этого не знал ;(


 
Max Zyuzin ©   (2005-04-29 16:12) [58]

>msguns ©   (29.04.05 16:09) [56]
Ой ля ля :). Имелось ввиду вариант работы одним единсвенным пользователем.


 
Max Zyuzin ©   (2005-04-29 16:14) [59]

>Stanislav ©   (29.04.05 16:06) [55]
Что бы вставлять например записи в master-detail в одной транзакции.


 
Stanislav ©   (2005-04-29 16:21) [60]

msguns ©   (29.04.05 16:12) [57]
Если б миф..
Каждому решению должна быть алтернатива.
И кто сказал что Max(id) будет работать медленее или отнимать больше ресурсов ?
Max Zyuzin ©   (29.04.05 16:14) [59]

Begin Transaction
--master
Insert...
@NEWID = ...
--detail
insert @newid...
...
...
Commit Transaction / rollback transaction


 
msguns ©   (2005-04-29 16:23) [61]

>Stanislav ©   (29.04.05 16:21) [60]

Стас, да идея-то ясна ! Чего уж жевать ?
Думаю, что Макс уж сам сообразит-то ;))


 
Stanislav ©   (2005-04-29 16:34) [62]

Я все равно не пойму кому нужно узнавать значение AI до...
Ну, допустим ты его узнал, получил и что дальше, а если в этот момент кто-то вставил новую запись в таблицу ?
..ибо MSSQL это вам не однопользовательский парадокс (Max Zyuzin ©
)


 
ANB ©   (2005-04-29 16:38) [63]

Stanislav ©   (29.04.05 16:34) [62] - узнавать ID до вставки - общепринятая практика, я сам так в Oracle частенько делаю. Только тогда нужно юзать сиквенсы или использовать способ msguns, если сиквенсы сервер не поддерживает. И в этом случае, если кто то инсертит паралельно запись в нашу таблицу, он получит другой ID. А вот твоя идея с max привет к одному ID или, что еще хуже, ты получишь не свой. Max прокатит, только если ты уверен, что работаешь один.


 
msguns ©   (2005-04-29 16:42) [64]

>ANB ©   (29.04.05 16:38) [63]
>Max прокатит, только если ты уверен, что работаешь один.

Ты не понял Стаса. Он сначала вставляет запись, а потом узнает ID. Просто вместо @@identity опрашивает max. Если это в одной транзакции, то рез-т одинаковый.


 
ANB ©   (2005-04-29 16:48) [65]

И такой же шустрый ?


 
msguns ©   (2005-04-29 16:55) [66]

Сильно сомневаюсь, хотя черт его знает

Всем спасибо за весьма содержательную беседу. Особый респект ANB © . Жаль, что так и не дождался ответа Полевого.

Пошел праздновать, чего и вам желаю ;))


 
Stanislav ©   (2005-04-29 16:57) [67]

msguns ©   (29.04.05 16:42) [64] - Правильно.
ANB ©   (29.04.05 16:38) [63]
Не хочу морочить тебе голову, но можно пример где может понадоится узнать ID до вставки ?


 
ANB ©   (2005-04-29 17:19) [68]

Элементарно, Ватсон. Ты выводишь форму для новой накладной. И хочешь, чтобы на ней уже был номер. А его тебе разрешили генерить из ID с дырками, лишь бы был разный.


 
Fay ©   (2005-04-29 17:26) [69]

Мыши плакали...



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

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

Наверх




Память: 0.64 MB
Время: 0.042 c
3-1114687648
msdn11
2005-04-28 15:27
2005.06.06
Теория


1-1116843208
Fynjy1984
2005-05-23 14:13
2005.06.06
TChart Как преобразовать координаты


14-1116366773
Гость__
2005-05-18 01:52
2005.06.06
Нужна седьмая симфония моцарта


14-1116391973
Жук
2005-05-18 08:52
2005.06.06
Трансляция финала кубка УЕФА


9-1110394276
Arkafon
2005-03-09 21:51
2005.06.06
GDI