Форум: "Базы";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизВопрос по 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.045 c