Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
7-1075539955
dr Tr0jan
2004-01-31 12:05
2004.04.11
Сервисы в Win2k


3-1079376690
Karlson
2004-03-15 21:51
2004.04.11
ProgressBar и кнопка Cancel


7-1080146989
$tranger
2004-03-24 19:49
2004.04.11
HOOKs


9-1071007468
i4004
2003-12-10 01:04
2004.04.11
Кто знает?


9-1065515385
Zergling
2003-10-07 12:29
2004.04.11
Отладка программы во время работы с DirectX





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