2008-10-29 4 views

ответ

10

Значение последней вставки SERIAL хранится в записи SQLCA как вторая запись в массиве sqlerrd. Ответ Брайана верен для ESQL/C, но вы не указали, какой язык вы используете.

Если вы пишете хранимую процедуру, значение можно найти следующим образом:

LET new_id = DBINFO('sqlca.sqlerrd1'); 

Она также может быть найден в $sth->{ix_sqlerrd}[1] при использовании DBI

Есть варианты для других языков/интерфейсов, но я уверен, что вы поймете эту идею.

1

Я это использовал.

if LOCAL_SQLCA^.sqlcode = 0 then 
/return serial */ 
    Result := LOCAL_SQLCA^.sqlerrd[1] 
else 
/* return error code */ 
    Result := -(Abs(LOCAL_SQLCA^.sqlcode)); 
+0

На каком языке это? Это Паскаль? И отрицание ABS немного странно; если вы не создаете соединение (для которого, к сожалению, есть хотя бы одна положительная ошибка), все номера ошибок в Informix отрицательны. – 2008-11-02 21:04:41

-1

Я не думаю, что «эффективное» - это слово, которое вы ищете здесь. Это скорее вопрос точности. Я не уверен, что могу лучше объяснить это, чем может использовать SQL Books Online, но, как правило, если вы действительно не знаете, что делаете, и имеете конкретную причину использования @@ IDENTITY, используйте SCOPE_IDENTITY. Наиболее очевидной причиной этого является то, что @@ IDENTITY не вернет личность последней записи, добавленной вашей программой/sp/etc, если есть триггер, прикрепленный к таблице. Кроме того, могут возникнуть проблемы в приложениях больших объемах, где две операции происходят в то же время и следующее будет происходить ...

  1. Добавленное
  2. вставки другого пользователя идентичность
  3. Верните другого пользователя к вам
+0

Возможно, вы заметили, что вопрос касается Informix, а не MS SQL – 2008-10-30 19:39:44

-5

В OP не указана какая версия Informix используется, поэтому могут быть разные ответы

+3

Это ненадежно - кто-то еще мог добавить новое, большее значение с момента его установки. – 2010-01-23 05:50:21