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

Вниз

Вопрос по SQL   Найти похожие ветки 

 
Vilux ©   (2004-03-13 11:40) [0]

Есть таблица с несколькими полями (например Id и Field1), первое из них ключевое, стоит автоинкрементом. Как при использовании команды
INSERT INTO Table field1 Values "asd";
узнать значение поля Id? Именно то, которое вставилось в таблицу.


 
anatolyk   (2004-03-13 11:58) [1]

Я делал через isert default values, a потом редактировал.


 
MOA ©   (2004-03-13 12:38) [2]

Либо
SELECT @@IDENTITY
либо
SELECT SCOPE_IDENTITY()
Подробности см. в BOL.
Удачи!


 
Vilux ©   (2004-03-14 10:54) [3]

Делаю
sql:="SELECT @@IDENTITY";
query.sql.txt:=sql;
query.open

Вроде выполняется, а теперь как мне вытащить результат?


 
Nikolay M. ©   (2004-03-14 11:34) [4]


> MOA ©   (13.03.04 12:38) [2]

А ты можешь дать гарантию, что между вставкой и SELECT @@IDENTITY не произойдет еще одного INSERT-а?
Правильный ответ: узнавать значение ключа ДО INSERT-а:
http://rsdn.ru/article/db/midas_migration.xml#XSLTSECTION124143120120


 
MOA ©   (2004-03-14 11:53) [5]

>А ты можешь дать гарантию, что между вставкой и SELECT @@IDENTITY не произойдет еще одного INSERT-а?
Если SELECT @@IDENTITY вызывается года через два - конечно, не могу.
А вот если сразу после инсерта - если значение @@IDENTITY может измениться в триггере - тогда, как уже сказано
SELECT SCOPE_IDENTITY()
спасёт отца русской демократии, за исключением случаев INSTEAD - триггеров, но там, видимо, такой проблемы и не стоит.
Решение же, предложенное в статье, IMHO, очередная попытка сделать самопальный механизм, реализующий уже существующую функциональность, и, как всегда в таких случаях, как следует нагружающий сервер лишними блокировками и выборками.


 
Vilux ©   (2004-03-14 12:19) [6]

Народ, так как мне вытащить результат из query?


 
MOA ©   (2004-03-14 12:34) [7]

ИЗ Delphi - оба запроса вернут вам рекордсет, состоящий из одной записи с одним полем. Значение этого поля нас и интересует - последнее IDENTITY (в сеансе, в случае @@IDENTITY, в "области" (scope) - в случае SCOPE_IDENTITY(), для таблицы во всех сеансах - в случае CURRENT_IDENTITY()).
Из хранимой процедуры MSSQL- например, так:
SELECT @MY_PEREM = @@IDENTITY
Удачи!


 
Nikolay M. ©   (2004-03-14 12:37) [8]


> Если SELECT @@IDENTITY вызывается года через два - конечно,
> не могу.
> А вот если сразу после инсерта

А где грань между "два года" и "сразу"? Есть какое-то конкретно число, где заканчивается "два года" и начинается "сразу"?

Во-первых, неизвестно, какая у автора версия SQL SERVER-а.
Во-вторых, неявная блокировка при UPDATE-е одной-единственной строки таблицы на несколько десятков записей - это не повод для разговоров о потере производительности (конечно, если таблица не разрастается на несколько тысяч записей в секунду).
В-третьих, описанный в статье вариант пойдет на любой версии MS SQL/SYBASE практически без изменений.
В-четвертых, на sql.ru и аналогичных форумах эта тема поднимается, наверное, раз в неделю и каждый раз разгораются споры, что лучше: SELECT MAX(ID), @@IDENTITY, SCOPE_IDENTITY или IDENT_CURRENT, причем большинство авторов остается каждый при своем мнении, поэтому я лично для себя решил, что надежнее иметь свой механизм.
В-пятых, наблюдаю такую схему (из статьи) уже не в первом коммерческом продукте (чужом).
Раздувать очередной флейм на эту тему не хотелось бы, все уже написано до нас, имхо, очередное обсасывание вопроса будет повторять предыдущие ветки
http://clarion.iphosting.ru/ExBB/topic.php?forum=5&topic=4&PHPSESSID=46f79a23695a95796347c3ba762052e6
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=44008&pg=-1#298028
например.


 
MOA ©   (2004-03-14 21:53) [9]

>Есть какое-то конкретно число, где заканчивается "два года" и начинается "сразу"?
Есть. Если в том же коннекте. И всё. Этого необходимо и достаточно.


 
sniknik ©   (2004-03-14 23:08) [10]

свои пять копеек
если мне нужно получить id записи после инсерта, просто посылаю команды в паре, проблем не было ни разу. а большинство аргументов в подобных спорах кажутся надуманными.
ADODataSet.CommandText:=
   "INSERT INTO (...) VALUES (....) "+
   "SELECT @@IDENTITY AS ID";
ADODataSet.Open;


 
Deniz ©   (2004-03-15 07:13) [11]

Может не в тему, но
Какое значение вернет "SELECT @@IDENTITY" если при вставке в таблицу в тригере дополнительно вставляется запись в лог или еще куда? Причем этот "второй" автоинкремент не нужен.


 
sniknik ©   (2004-03-15 10:32) [12]

ели есть вероятность что перед инсертом еше еще куданибуь вставка идет в тригерах (и этот "второй" не нужен), то на этот случай IDENT_CURRENT и не надо мучится подобными вопросами.


 
MOA ©   (2004-03-15 10:54) [13]

Поправка - в случае вставки в триггерах - не IDENT_CURRENT(), а SCOPE_IDENTITY()



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

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

Наверх




Память: 0.5 MB
Время: 0.035 c
1-1080126192
lena19
2004-03-24 14:03
2004.04.11
DELPHI8 NET


14-1082295870
Batoon
2004-04-18 17:44
2004.04.11
помогите!!! посоветуйте какую-нить прогу...


1-1079705992
V-Isa
2004-03-19 17:19
2004.04.11
Алгоритм определения количества "счастливых" чисел


3-1082025465
Flahas
2004-04-15 14:37
2004.04.11
exel..


9-1071424125
Legafor
2003-12-14 20:48
2004.04.11
Direct 3D доступ к видеопамяти