2009-02-22 8 views

Répondre

14

@@IDENTITY renvoie l'identité la plus récente générée dans la session en cours. Dans la plupart des cas, vous voudrez probablement utiliser SCOPE_IDENTITY à la place, ce qui renvoie l'identité la plus récente générée dans la portée actuelle.

Par exemple, si vous insérez une ligne dans table1, mais cet insert déclenche un trigger qui insère une ligne dans table2, puis @@IDENTITY retournera l'identité de table2 alors SCOPE_IDENTITY retournera l'identité de table1.

INSERT INTO my_table (my_column) VALUES ('test') 

-- return the identity of the row you just inserted into my_table 
-- regardless of any other inserts made by triggers etc 
SELECT SCOPE_IDENTITY() AS ins_id 
+0

J'ai aussi vu: SELECT CAST (COALESCE (SCOPE_IDENTITY(), @@ IDENTITY) int) – jjwdesign

+0

voté vers le bas. Je ne vois pas de php, la question était "Comment obtenir l'ID d'insertion dans MSSQL en PHP". –

1

Non; cela fonctionne un peu comme SELECT LAST_INSERT_ID() dans mysql, récupérant la dernière valeur d'identité insérée. Vous pouvez jeter un oeil à this in-depth examination pour en savoir plus sur ce que vous pourriez vouloir être préoccupé par cela.

1

Voici un extrait de code basé sur le code Joomla. $ dbh est la connexion à la base de données (résultat de mssql_connect()). Le nom de la clé (ID) est mis à jour si vous transmettez l'argument $ keyName.

Ce code utilise le mot-clé MSSQL "OUTPUT" pour obtenir l'ID (ou toute valeur requise) de la valeur insérée.

function mssql_insertObject($table, &$object, $keyName = NULL) 
{ 
    global $dbh; 

    if($keyName) { 
     $fmtsql = 'INSERT INTO '. $table .' (%s) OUTPUT INSERTED.' . $keyName . ' VALUES (%s) '; 
    } 
    else { 
     $fmtsql = 'INSERT INTO '. $table .' (%s) VALUES (%s) '; 
    } 

    $fields = array(); 

    foreach (get_object_vars($object) as $k => $v) { 
     if (is_array($v) or is_object($v) or $v === NULL) { 
      continue; 
     } 

     if ($k[0] == '_') { // internal field 
      continue; 
     } 

     $fields[] = $k; 
     $values[] = "'" . str_replace("'", "''", $v) . "'"; 
    } 

    $sql = sprintf($fmtsql, implode(",", $fields) , implode(",", $values)); 

    $query = mssql_query($sql, $dbh); 

    if($query === false) { 
     return false; 
    } 

    if(is_resource($query)) 
    { 
     if($keyName) { 
      $id = mssql_result($query, 0, 0); 

      if($id) { 
       $object->$keyName = $id; 
      } 
     } 

     mssql_free_result($query); 
    } 

    return true; 
} 
+0

J'aime cette solution car je crois qu'elle couvre toutes vos bases puisque vous ne pouvez pas obtenir un GUID (pk) avec SCOPE_IDENTITY ..mais en utilisant mssql_result en conjonction avec OUTPUT INSERTED dans votre instruction sql fonctionne avec des pk qui sont des entiers auto incrémentés ou uniques pique comme les GUID. – greaterKing

Questions connexes