Compartir a través de


Especificar un tipo de cursor y seleccionar filas

A partir de la versión 1.1 del Controlador de SQL Server para PHP, puede crear un conjunto de resultados con filas a las que se puede tener acceso en cualquier orden, en función del tipo de cursor.

Tipos de cursor

Al crear un conjunto de resultados con sqlsrv_query o sqlsrv_prepare, puede especificar el tipo de cursor. De manera predeterminada, se usa un cursor de solo avance. Con un cursor de solo avance, se puede avanzar por las filas de una en una, empezando en la primera fila del conjunto de resultados y hasta llegar al final del conjunto. Era el único tipo de cursor disponible en la versión 1.0 del Controlador de SQL Server para PHP.

A partir de la versión 1.1 del Controlador de SQL Server para PHP, puede crear un conjunto de resultados con un cursor de desplazamiento, que permite tener acceso a cualquier fila del conjunto de resultados, en cualquier orden. En la siguiente tabla se muestran los valores que se pueden pasar a la opción Scrollable en sqlsrv_query o sqlsrv_prepare.

Opción Descripción

SQLSRV_CURSOR_FORWARD

Este tipo de cursor permite avanzar por las filas de una en una, empezando en la primera fila del conjunto de resultados y hasta llegar al final del conjunto.

Es el tipo de cursor predeterminado.

sqlsrv_num_rows devuelve un error para los conjuntos de resultados creados con este tipo de cursor.

forward es la forma abreviada de SQLSRV_CURSOR_FORWARD.

SQLSRV_CURSOR_STATIC

Este cursor permite tener acceso a las filas en cualquier orden, pero no reflejará los cambios realizados en la base de datos.

static es la forma abreviada de SQLSRV_CURSOR_STATIC.

SQLSRV_CURSOR_DYNAMIC

Este cursor permite tener acceso a las filas en cualquier orden y reflejará los cambios realizados en la base de datos.

sqlsrv_num_rows devuelve un error para los conjuntos de resultados creados con este tipo de cursor.

dynamic es la forma abreviada de SQLSRV_CURSOR_DYNAMIC.

SQLSRV_CURSOR_KEYSET

Este cursor permite tener acceso a las filas en cualquier orden. Con todo, un cursor de conjunto de claves no actualiza el recuento de filas si se elimina una fila de la tabla (una fila eliminada se devuelve sin valores).

keyset es la forma abreviada de SQLSRV_CURSOR_KEYSET.

Si una consulta genera varios conjuntos de resultados, la opción Scrollable se aplica a todos ellos.

Seleccionar filas de conjuntos de resultados

Después de crear un conjunto de resultados estático, dinámico o de conjunto de claves, puede usar sqlsrv_fetch, sqlsrv_fetch_array o sqlsrv_fetch_object para especificar una fila.

En la siguiente tabla se describen los valores que se pueden especificar en el parámetro row.

Parámetro Descripción

SQLSRV_SCROLL_NEXT

Fila siguiente. Es el valor predeterminado, si no se especifica el parámetro row para un conjunto de resultados de desplazamiento.

SQLSRV_SCROLL_PRIOR

Fila anterior a la actual.

SQLSRV_SCROLL_FIRST

Primera fila del conjunto de resultados.

SQLSRV_SCROLL_LAST

Última fila del conjunto de resultados.

SQLSRV_SCROLL_ABSOLUTE

Fila especificada con el parámetro offset.

SQLSRV_SCROLL_RELATIVE

Fila especificada con el parámetro offset a partir de la fila actual. Se admiten números negativos.

Ejemplo

Descripción

En el siguiente ejemplo se muestra el efecto que tienen distintos cursores. En la línea 33 del ejemplo se observa la primera de tres instrucciones de consulta que especifican distintos cursores. Dos de las instrucciones de consulta tienen comentarios. Use un cursor distinto cada vez que ejecute el programa, para ver el efecto que tiene la actualización de la base de datos en la línea 47.

Código

<?php
$server = "server_name";
$conn = sqlsrv_connect( $server, array( 'Database' => 'test' ));
if ( $conn === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "DROP TABLE dbo.ScrollTest" );
if ( $stmt !== false ) { 
   sqlsrv_free_stmt( $stmt ); 
}

$stmt = sqlsrv_query( $conn, "CREATE TABLE ScrollTest (id int, value char(10))" );
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 1, "Row 1" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 2, "Row 2" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "INSERT INTO ScrollTest (id, value) VALUES(?,?)", array( 3, "Row 3" ));
if ( $stmt === false ) {
   die( print_r( sqlsrv_errors(), true ));
}

$stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'keyset' ));
// $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'dynamic' ));
// $stmt = sqlsrv_query( $conn, "SELECT * FROM ScrollTest", array(), array( "Scrollable" => 'static' ));

$rows = sqlsrv_has_rows( $stmt );
if ( $rows != true ) {
   die( "Should have rows" );
}

$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_LAST );
$field1 = sqlsrv_get_field( $stmt, 0 );
$field2 = sqlsrv_get_field( $stmt, 1 );
echo "\n$field1 $field2\n";

$stmt2 = sqlsrv_query( $conn, "delete from ScrollTest where id = 3" );
// or
// $stmt2 = sqlsrv_query( $conn, "UPDATE ScrollTest SET id = 4 WHERE id = 3" );
if ( $stmt2 !== false ) { 
   sqlsrv_free_stmt( $stmt2 ); 
}

$result = sqlsrv_fetch( $stmt, SQLSRV_SCROLL_LAST );
$field1 = sqlsrv_get_field( $stmt, 0 );
$field2 = sqlsrv_get_field( $stmt, 1 );
echo "\n$field1 $field2\n";

sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );
?>

Vea también

Otros recursos

Recuperar datos