2

INSERT ステートメントの後で SERIAL 列の値を取得する最も効率的な方法は何ですか? つまり、MS SQL の複製@@IDENTITYまたは機能の方法を探しています。SCOPE_IDENTITY

4

4 に答える 4

11

最後の SERIAL 挿入の値は、sqlerrd 配列の 2 番目のエントリとして、SQLCA レコードに格納されます。ブライアンの答えは ESQL/C では正しいですが、使用している言語について言及していません。

ストアド プロシージャを作成している場合、値は次のように見つけることができます。

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

$sth->{ix_sqlerrd}[1]DBI を使用している場合にも見つかります

他の言語/インターフェース用のバリアントがありますが、きっと理解できると思います。

于 2008-10-31T02:11:11.540 に答える
1

これが使われているのを見たことがあります。

if LOCAL_SQLCA^.sqlcode = 0 then
/* return serial */
  Result := LOCAL_SQLCA^.sqlerrd[1]
else
/* return error code */
  Result := -(Abs(LOCAL_SQLCA^.sqlcode));
于 2008-10-29T15:06:02.397 に答える
-1

ここで探している言葉は「効率的」ではないと思います。それは正確さの問題です。SQL Books Onlineよりもうまく説明できるかどうかはわかりませんが、一般的に、自分が何をしているかを本当に理解していて、@@ IDENTITYを使用する特別な理由がない限り、SCOPE_IDENTITYを使用してください。これの最も明白な理由は、テーブルにトリガーがアタッチされている場合、@@IDENTITYがprogram/ sp/etcによって追加された最新のレコードのIDを返さないことです。また、2つのトランザクションが同時に発生し、次のような問題が発生する大量のアプリケーションで問題が発生する可能性があります...

  1. あなたの挿入物
  2. 他のユーザーの挿入
  3. 他のユーザーのIDをあなたに返します
于 2008-10-29T22:27:15.503 に答える
-5

OPは、使用されているInformixのバージョンを指定していないため、異なる回答が存在する可能性があります

于 2010-01-23T05:01:01.213 に答える