2011-05-26 15 views
9

En otras circunstancias podría tener la tentación de utilizar¿Cómo puedo obtener el ID de la última fila INSERTed usando PDO con SQL Server?

$result = mssql_query("INSERT INTO table (fields) VALUES (data); 
         SELECT CAST(scope_identity() AS int)"); 

pero como voy a insertar datos enviados por el usuario, quiero seguir utilizando DOP, que devuelve una matriz vacía.

Desafortunadamente, estoy ejecutando PHP en un servidor Linux y usando dblib para interactuar con Microsoft SQL Server, que no es compatible con PDO::lastInsertID().

Por favor ayuda!

actualización para incluir código de ejemplo

Aquí está el código que estoy usando: col1 es un campo de tipo int identity y col2 es un datetime su valor predeterminado es getdate().

// Connect to db with PDO 
$pdo = new PDO('dblib:host=' . $host . ';dbname=' . $database . ';', $username, $password, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)); 
// Connect to db with MSSQL 
$sql = mssql_connect($host, $username, $password); 
mssql_select_db($database, $sql); 
// Create SQL statement 
$query = "INSERT INTO [table] (col3, col4, col5) 
      VALUES ('str1', 'str2', 'str3'); 
      SELECT SCOPE_IDENTITY() AS theID;"; 
// Run with MSSQL 
echo "Using MSSQL...\n"; 
$result = mssql_query($query); 
$the_id = mssql_result($result, 0, 'theID'); 
echo "Query OK. Returned ID is " . $the_id . "\n"; 
// Run with PDO 
echo "\nUsing PDO...\n"; 
$stmt = $pdo->query($query); 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
print_r($result); 

Y esto es lo que se mostrará:

Using MSSQL... 
Query OK. Returned ID is 149 

Using PDO... 
Array 
(
) 

Me encantaría descubrir que lo que había hecho algo estúpido, en lugar de venir en contra de un callejón sin salida terrible :)

Respuesta

10

tienes un par de opciones:

SELECT @@IDENTITY - return the last ID created by actions of the current connection, regardless of table/scope 

SELECT SCOPE_IDENTITY() - last ID produced by the current connection, in scope, regardless of table 

SELECT IDENT_CURRENT('name_of_table'); - last ID produced on that table, regardless of table/scope/connection 

De los tres, SCOPE_IDENTITY() es el mejor candidato.

+0

'PDO' aún devuelve una matriz vacía. ¿Estoy haciendo algo mal? – Kalessin

+0

Quizás intente aliasing los resultados: 'SELECT scope_identity() AS id' –

+0

Gracias por su sugerencia. Todavía estoy recibiendo una matriz vacía. He actualizado mi pregunta para incluir el código de prueba que estoy usando. – Kalessin

0

Quizás le estén devolviendo dos conjuntos de filas. Intente agregar SET NOCOUNT ON; para eliminar el conjunto de filas INSERT, o use $ stmt-> nextRowset si su controlador lo admite.

Cuestiones relacionadas