Frage

Was ist der effizienteste Weg, um den Wert des SERIAL Spalte nach der INSERT-Anweisung zu bekommen? D. h Ich bin auf der Suche nach einer Möglichkeit, @@IDENTITY oder SCOPE_IDENTITY Funktionalität von MS SQL

zu replizieren
War es hilfreich?

Lösung

Der Wert des letzten SERIAL Einsatz wird in der SQLCA Aufzeichnung, wie der zweite Eintrag in der sqlerrd Array gespeichert. Brians Antwort ist richtig für ESQL / C, aber Sie haben nicht erwähnt, welche Sprache Sie verwenden.

Wenn Sie eine gespeicherte Prozedur schreiben, kann der Wert so gefunden werden:

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

Es kann auch in $sth->{ix_sqlerrd}[1] gefunden werden, wenn DBI mit

Es gibt Varianten für andere Sprachen / Schnittstellen, aber ich bin sicher, dass Sie die Idee.

Andere Tipps

habe ich gesehen, das verwendet wird.

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

Ich glaube nicht „effizient“ ist das Wort, das Sie hier suchen. Es ist eher eine Frage der Genauigkeit. Ich bin mir nicht sicher, ob ich einen besseren Job zu erklären, es ist als die SQL-Online kann, aber in der Regel, wenn Sie wirklich wissen, was Sie tun und haben einen bestimmten Grund für die Verwendung von @@ IDENTITY verwenden SCOPE_IDENTITY. Der offensichtlichste Grund dafür ist, dass @@ IDENTITY wird die Identität der aktuellen Platte von Ihrem Programm / sp / etc hinzugefügt nicht zurückgeben, wenn es ein Trigger ist am Tisch befestigt. Auch könnte es Probleme in hochvolumigen Anwendungen, bei denen zwei Transaktionen zur gleichen Zeit auftreten und die folgend auftreten würde ...

  1. Ihr Einsatz
  2. Andere Benutzer des Einsatzes
  3. Zurück anderen die Identität des Benutzers zu Ihnen

Die OP hat nicht angegeben, welche Version von Informix verwendet wird, so kann es unterschiedliche Antworten geben

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top