Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.013 c
1-1116867632
DenisWW
2005-05-23 21:00
2005.06.06
Как работать с буфером обмена


6-1111370769
administrator
2005-03-21 05:06
2005.06.06
Delph NET


6-1111215452
Radgar
2005-03-19 09:57
2005.06.06
Проблема SendText в ServerSocket


4-1113559553
Dot
2005-04-15 14:05
2005.06.06
CreateWindow и TForm1


1-1116736940
Никита
2005-05-22 08:42
2005.06.06
Как узнать длину строки в пикселях





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский