2009-02-22 26 views
7

Lo que dice el título de la pregunta. Con una consulta como SELECT @@IDENTITY AS ins_id, ¿necesito proporcionar el nombre de la tabla o cualquier otra información para especificar de qué tabla/base de datos estoy hablando?Cómo obtener Insertar ID en MSSQL en PHP?

Respuesta

14

@@IDENTITY devuelve la identidad más reciente generada en la sesión actual. En la mayoría de los casos, probablemente prefiera usar SCOPE_IDENTITY, que devuelve la identidad más reciente generada en el ámbito actual.

Por ejemplo, si inserta una fila en tabla1, pero esa inserción activa un desencadenador que inserta una fila en tabla2, entonces @@IDENTITY volverá la identidad de tabla2 mientras que SCOPE_IDENTITY volverá la identidad 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

También he visto: SELECT CAST (COALESCE (SCOPE_IDENTITY(), @@ IDENTITY) como INT) – jjwdesign

+0

abajo votaron. No veo ningún php, la pregunta era "Cómo obtener Insertar ID en MSSQL en PHP". –

1

No; funciona de forma muy parecida a SELECT LAST_INSERT_ID() en mysql, recuperando el último valor de identidad insertado. Es posible que desee echar un vistazo a this in-depth examination para obtener más información sobre lo que le puede interesar.

1

Aquí hay un fragmento de código basado en el código de Joomla. $ dbh es la conexión de la base de datos (resultado de mssql_connect()). El nombre clave (ID) se actualiza si pasa el argumento $ keyName.

Este código usa la palabra clave MSSQL "OUTPUT" para obtener la ID (o cualquier valor requerido) del valor insertado.

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

Me gusta esta solución porque creo que cubre todas tus bases ya que no puedes obtener un GUID (pk) con SCOPE_IDENTITY ... pero usar mssql_result junto con OUTPUT INSERTED en tu instrucción sql funciona con pk que son números enteros incrementados automáticamente o únicos picaduras como GUIDs. – greaterKing

Cuestiones relacionadas