![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по SQL [D6, MSSQL]
Vilux © (2004-03-13 11:40:00)Есть таблица с несколькими полями (например Id и Field1), первое из них ключевое, стоит автоинкрементом. Как при использовании команды
INSERT INTO Table field1 Values 'asd';
узнать значение поля Id? Именно то, которое вставилось в таблицу.
MOA (2004-03-15 10:54:00) [1]Поправка - в случае вставки в триггерах - не IDENT_CURRENT(), а SCOPE_IDENTITY()
sniknik (2004-03-15 10:32:00) [2]ели есть вероятность что перед инсертом еше еще куданибуь вставка идет в тригерах (и этот "второй" не нужен), то на этот случай IDENT_CURRENT и не надо мучится подобными вопросами.
Deniz (2004-03-15 07:13:00) [3]Может не в тему, но
Какое значение вернет "SELECT @@IDENTITY" если при вставке в таблицу в тригере дополнительно вставляется запись в лог или еще куда? Причем этот "второй" автоинкремент не нужен.
sniknik (2004-03-14 23:08:00) [4]свои пять копеек
если мне нужно получить id записи после инсерта, просто посылаю команды в паре, проблем не было ни разу. а большинство аргументов в подобных спорах кажутся надуманными.
ADODataSet.CommandText:=
'INSERT INTO (...) VALUES (....) '+
'SELECT @@IDENTITY AS ID';
ADODataSet.Open;
MOA (2004-03-14 21:53:00) [5]>Есть какое-то конкретно число, где заканчивается "два года" и начинается "сразу"?
Есть. Если в том же коннекте. И всё. Этого необходимо и достаточно.
Nikolay M. (2004-03-14 12:37:00) [6]
> Если 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 12:34:00) [7]ИЗ Delphi - оба запроса вернут вам рекордсет, состоящий из одной записи с одним полем. Значение этого поля нас и интересует - последнее IDENTITY (в сеансе, в случае @@IDENTITY, в "области" (scope) - в случае SCOPE_IDENTITY(), для таблицы во всех сеансах - в случае CURRENT_IDENTITY()).
Из хранимой процедуры MSSQL- например, так:
SELECT @MY_PEREM = @@IDENTITY
Удачи!
Vilux (2004-03-14 12:19:00) [8]Народ, так как мне вытащить результат из query?
MOA (2004-03-14 11:53:00) [9]>А ты можешь дать гарантию, что между вставкой и SELECT @@IDENTITY не произойдет еще одного INSERT-а?
Если SELECT @@IDENTITY вызывается года через два - конечно, не могу.
А вот если сразу после инсерта - если значение @@IDENTITY может измениться в триггере - тогда, как уже сказано
SELECT SCOPE_IDENTITY()
спасёт отца русской демократии, за исключением случаев INSTEAD - триггеров, но там, видимо, такой проблемы и не стоит.
Решение же, предложенное в статье, IMHO, очередная попытка сделать самопальный механизм, реализующий уже существующую функциональность, и, как всегда в таких случаях, как следует нагружающий сервер лишними блокировками и выборками.
Nikolay M. (2004-03-14 11:34:00) [10]
> MOA © (13.03.04 12:38) [2]
А ты можешь дать гарантию, что между вставкой и SELECT @@IDENTITY не произойдет еще одного INSERT-а?
Правильный ответ: узнавать значение ключа ДО INSERT-а:
http://rsdn.ru/article/db/midas_migration.xml#XSLTSECTION124143120120
Vilux (2004-03-14 10:54:00) [11]Делаю
sql:='SELECT @@IDENTITY';
query.sql.txt:=sql;
query.open
Вроде выполняется, а теперь как мне вытащить результат?
MOA (2004-03-13 12:38:00) [12]Либо
SELECT @@IDENTITY
либо
SELECT SCOPE_IDENTITY()
Подробности см. в BOL.
Удачи!
anatolyk (2004-03-13 11:58:00) [13]Я делал через isert default values, a потом редактировал.