Solución:
Cuando intento ver el conjunto de resultados
$ fila = sqlsrv_fetch_array ($ consulta, SQLSRV_FETCH_ASSOC);
print_r ($ fila); `
Dado que enumeró esto por separado, espero que no esté haciendo esto (mostrando todo el código):
$col="abcd";
$stmt = "SELECT id, sqlsrv array doesn't return all rows FROM dbo.tbl WHERE col = ?";
$params = array( $col );
$options = array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$query = sqlsrv_query( $conn, $stmt, $params, $options );
if( $query === false ) {
print( print_r( sqlsrv_errors() ) );
}
while( $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
...
$row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC );
print_r($row);
}
Porque entonces es obvio que estás consumiendo sqlsrv_fetch_array dos veces por iteración de bucle, una vez para la verificación de condición y una vez dentro el lazo.
Elimine toda la pelusa del ciclo while y tenga solo esto, y absolutamente nada más, ni siquiera los … o los comentarios.
while( $row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
print_r($row);
}
sqlsrv_fetch_array
: Devuelve el Siguiente fila de datos disponible como una matriz asociativa, una matriz numérica o ambas (el valor predeterminado).
Énfasis mío.
Valores devueltos: devuelve una matriz en caso de éxito, NULL si no hay más filas para devolver y FALSE si se produce un error.
Deberá realizar un ciclo while para recuperar todos los registros, como este:
while ($row = sqlsrv_fetch_array( $query, SQLSRV_FETCH_ASSOC )) {
//process $row
}