2008-10-29 5 views

Répondre

10

La valeur de la dernière insertion SERIAL est stockée dans l'enregistrement SQLCA, en tant que deuxième entrée dans la matrice sqlerrd. La réponse de Brian est correcte pour ESQL/C, mais vous n'avez pas mentionné la langue que vous utilisez.

Si vous écrivez une procédure stockée, la valeur se trouve ainsi:

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

Il peut également être trouvée dans $sth->{ix_sqlerrd}[1] si vous utilisez DBI

Il existe des variantes pour d'autres langues/interfaces, mais je suis sûr que vous aurez l'idée.

1

J'ai vu cela utilisé.

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

Quelle est cette langue? Est-ce Pascal? Et l'ABS inversé est un peu étrange; sauf si vous établissez une connexion (pour laquelle il existe malheureusement au moins une erreur positive), tous les numéros d'erreur dans Informix sont négatifs. –

-1

Je ne pense pas que "efficace" est le mot que vous cherchez ici. C'est plus une question d'exactitude. Je ne suis pas sûr de pouvoir mieux l'expliquer que le livre en ligne de SQL, mais généralement, à moins que vous ne sachiez vraiment ce que vous faites et ayez une raison spécifique d'utiliser @@ IDENTITY, utilisez SCOPE_IDENTITY. La raison la plus évidente de ceci est que @@ IDENTITY ne retournera pas l'identité du dernier enregistrement ajouté par votre programme/sp/etc s'il y a un déclencheur attaché à la table. En outre, il pourrait y avoir des problèmes dans les applications de haute volume lorsque deux transactions se produisent en même temps et les phénomènes frapperont ...

  1. Votre insert
  2. insert de Un autre utilisateur
  3. Retour autre l'identité de l'utilisateur pour vous
+0

Vous remarquerez peut-être que la question concerne Informix, pas MS SQL –

-5

L'OP n'a pas spécifié quelle version d'Informix est utilisée, donc il peut y avoir différentes réponses

+3

Ceci n'est pas fiable - quelqu'un d'autre aurait peut-être inséré une valeur plus grande et plus récente depuis votre insertion. –

+0

L'OP n'a pas spécifié quelle version d'Informix est utilisée, il peut donc y avoir plusieurs réponses correctes. –

Questions connexes