Come ottenere l'ID di inserimento in MSSQL in PHP?


7

Cosa dice il titolo della domanda. Con una query come SELECT @@IDENTITY AS ins_id, devo fornire il nome della tabella o altre informazioni per specificare quale tabella/database di cui sto parlando?

14

@@IDENTITY restituisce l'identità più recente generata nella sessione corrente. Nella maggior parte dei casi probabilmente vorrai utilizzare SCOPE_IDENTITY, che restituisce l'identità più recente generata nell'ambito corrente.

Ad esempio, se si inserisce una riga in table1, ma che inserto attiva un trigger che inserisce una riga in table2, quindi @@IDENTITY restituirà l'identità dal table2 mentre SCOPE_IDENTITY tornerà l'identità da tabella1.

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

Ho visto anche: SELEZIONE CAST (COALESCE (SCOPE_IDENTITY(), @@ IDENTITY) AS int) 14 mag. 142014-05-14 19:37:47

  0

giù votato. Non vedo alcun php, la domanda era "Come ottenere l'ID di inserimento in MSSQL in PHP". 27 giu. 152015-06-27 02:40:49


1

No; funziona molto come SELECT LAST_INSERT_ID() in mysql, recuperando l'ultimo valore di identità inserito. Si consiglia di dare un'occhiata a this in-depth examination per ulteriori informazioni su ciò che si vorrebbe essere preoccupato con esso.


1

Ecco uno snippet di codice in qualche modo basato sul codice Joomla. $ dbh è una connessione al database (risultato di mssql_connect()). Il nome della chiave (ID) viene aggiornato se si passa l'argomento $ keyName.

Questo codice utilizza la parola chiave MSSQL "OUTPUT" per ottenere l'ID (o qualsiasi valore richiesto) del valore inserito.

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

Mi piace questa soluzione perché credo che copra tutte le tue basi poiché non puoi ottenere un GUID (pk) con SCOPE_IDENTITY ..ma usando mssql_result in congiunzione con OUTPUT INSERTED nella tua istruzione sql funziona con pk's che sono interi auto incrementati o unici punge come GUID. 02 ago. 172017-08-02 17:49:58