Compartir a través de


Cómo detectar conjuntos de resultados vacíos

En este tema se muestra cómo determinar si un conjunto de resultados está vacío cuando se usa el Controlador de SQL Server para PHP.

Nota

Si usa la versión 1.1 del Controlador de SQL Server para PHP, puede usar sqlsrv_has_rows para determinar si un conjunto de resultados tiene filas.

En la versión 1.0 de Controlador de SQL Server para PHP, la práctica recomendada para determinar si el conjunto de resultados de una instrucción está vacío es llamar a sqlsrv_fetch, sqlsrv_fetch_array o sqlsrv_fetch_object de la instrucción y examinar el valor devuelto. Si el conjunto de resultados activo no contiene resultados, la llamada a la función devolverá null. Tenga en cuenta que si llama a una de estas funciones en una instrucción que no devuelve un conjunto de resultados (a diferencia de una instrucción que devuelva un conjunto de resultados vacío), devolverá false.

Cuando use sqlsrv_fetch, sqlsrv_fetch_array o sqlsrv_fetch_object, debe incluir código para procesar cada una de las filas de datos antes de realizar la siguiente llamada a una de estas funciones. Cada fila que se haya capturado ya no estará disponible después de la siguiente llamada a una de estas funciones.

En este tema se proporcionan dos ejemplos. En el primero, se buscan conjuntos de resultados vacíos cuando se ejecuta una consulta simple varias veces. En el segundo, se buscan conjuntos de resultados vacíos devueltos por un procedimiento almacenado.

Ejemplo

En el siguiente ejemplo, se muestra el uso de sqlsrv_fetch_array para determinar si un conjunto de resultados está vacío. En el ejemplo, se ejecuta una consulta varias veces, cada una de ellas con un valor de parámetro distinto. Observe que la segunda ejecución de la consulta (siendo "X" el valor del parámetro) devuelve un conjunto de resultados vacío. En el ejemplo, se usa una función (ProcessRow) para procesar cada fila de un conjunto de resultados que contenga resultados. Si el conjunto de resultados está vacío, se imprime el siguiente mensaje: "El conjunto de resultados está vacío".

En el ejemplo, se supone que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Cuando se ejecuta el ejemplo desde la línea de comandos, todos los resultados se escriben en la consola.

<?php
/*Connect to the local server using Windows Authentication and specify
the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
if( !($conn = sqlsrv_connect( $serverName, $connectionInfo)))
{
     echo "Could not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Define the Tranasact-SQL query. */
$tsql = "SELECT EmailAddress FROM Person.Contact where LastName = ?";

/* Set up an array of parameter arrays. */
$param_arrays = array(
                      array("Jacobson"), 
                      array("X"), 
                      array("Akers")
                     );

/* Execute the query for each parameter array. */
foreach( $param_arrays as $params )
{
     if( !($stmt = sqlsrv_query($conn, $tsql, $params)))
     {
          echo "Error in statement execution.\n";
          die( print_r( sqlsrv_errors(), true));
     }

     echo "Results for LastName = $params[0]:\n";

     /* Determine if there are results.  If there are results, display
        them. If there are no results, display an appropriate message.
        If an error occured, display the error message.*/
     $row = sqlsrv_fetch_array( $stmt );
     if( $row )
     {
          /* Process each row of the result set and retrieve the next
             row.*/
          do
          {
               ProcessRow( $row ); 
               $row = sqlsrv_fetch_array( $stmt );
          } while( $row );
     }
     elseif( is_null($row))
     {
          echo "The result set is empty.\n";
     }
     elseif( $row === false )
     {
          die(print_r( sqlsrv_errors(), true ));
     }
     echo "----------------\n";
}

/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);

/* Function for processing a row of data. */
function ProcessRow( $row )
{
     echo $row[0]."\n";
}
?>

Con el fin de que este ejemplo se base en la búsqueda de resultados vacíos, no se buscan errores en todas las llamadas a funciones. Para obtener información sobre el control de errores, vea Controlar errores y advertencias.

En el siguiente ejemplo, se muestra el uso de sqlsrv_fetch para determinar si un conjunto de resultados está vacío. En el ejemplo, se ejecuta un procedimiento almacenado varias veces, cada una de ellas con un valor de parámetro distinto. El procedimiento almacenado elimina un elemento de línea (SalesOrderID) de un pedido de ventas, actualiza la entrada del inventario para el identificador de producto correspondiente y, a continuación, devuelve el resto de los elementos de línea del pedido de ventas. Observe que la segunda ejecución de la consulta (siendo "121293" el valor del parámetro) corresponde a un pedido que sólo contiene un elemento de línea. El procedimiento almacenado elimina este elemento de línea, pero cuando ejecuta la consulta para que devuelva el resto de los elementos de línea, el conjunto de resultados está vacío. En el ejemplo, se usa una función (ProcessRow) para procesar cada fila de un conjunto de resultados que contenga resultados. Si el conjunto de resultados está vacío, se imprime el mensaje: "El conjunto de resultados está vacío".

En el ejemplo, se supone que SQL Server y la base de datos AdventureWorks están instalados en el equipo local. Cuando se ejecuta el ejemplo desde la línea de comandos, todos los resultados se escriben en la consola.

<?php
/* Connect to the local server using Windows Authentication and 
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
     echo "Could not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Drop the stored procedure if it already exists. */
$tsql_dropSP = "IF OBJECT_ID('UpdateInventory', 'P') IS NOT NULL 
                DROP PROCEDURE UpdateInventory";
$stmt1 = sqlsrv_query( $conn, $tsql_dropSP);
if( $stmt1 === false )
{
     echo "Error in executing statement 1.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Create the stored procedure. */
$tsql_createSP = "CREATE PROCEDURE UpdateInventory
                       @SalesOrderDetailID int
                  AS
                       BEGIN
                        --Get the SalesOrderID, ProductID, and Quantity
                        DECLARE @SalesOrderID int;
                        DECLARE @ProductID int;
                        DECLARE @OrderQty int;
                        SELECT @SalesOrderID = SalesOrderID,
                                   @ProductID = ProductID,
                                   @OrderQty = OrderQty
                        FROM Sales.SalesOrderDetail
                        WHERE SalesOrderDetailID = @SalesOrderDetailID;

                        --Update Inventory
                        UPDATE Production.ProductInventory 
                        SET Quantity = Quantity + @OrderQty 
                        WHERE ProductID = @ProductID;

                        --Delete the OrderDetail
                        DELETE FROM Sales.SalesOrderDetail
                        WHERE SalesOrderDetailID = @SalesOrderDetailID;

                        --Get remaining products for SalesOrderID
                        SELECT SalesOrderID,
                        SalesOrderDetailID,
                        ProductID,
                        OrderQty
                        FROM Sales.SalesOrderDetail
                        WHERE SalesOrderID = @SalesOrderID;
                    END";
$stmt2 = sqlsrv_query( $conn, $tsql_createSP);
if( $stmt2 === false)
{
     echo "Error in executing statement 2.\n";
     die( print_r( sqlsrv_errors(), true));
}
/*-------- The next few steps call the stored procedure. --------*/

/* Define the Transact-SQL query. Use question marks (?) in place of 
the parameters to be passed to the stored procedure */
$tsql_callSP = "{call UpdateInventory(?)}";

/* Define an array of parameter arrays. */
$param_arrays = array( 
                      array(16434),
                      array(121293)
                     );

/* Execute the query for each parameter array. */
foreach($param_arrays as $params)
{
     $stmt = sqlsrv_query( $conn, $tsql_callSP, $params);
     if( $stmt === false)
     {
          echo "Error in executing statement.\n";
          die( print_r( sqlsrv_errors(), true));
     }
     /* The first SELECT statement in the stored procedure only sets 
          the parameter values. It does not return a result set.*/
     /* Display the rows affected by the UPDATE statement in the stored 
        procedure and move to the next result. */
     echo "Rows updated: ".sqlsrv_rows_affected( $stmt )."\n";
     sqlsrv_next_result($stmt);

     /* Display the rows affected by the DELETE statement in the stored 
        procedure and move to the next result. */
     echo "Rows deleted: ".sqlsrv_rows_affected( $stmt )."\n";
     sqlsrv_next_result( $stmt );

     /* Determine if there are results returned by the SELECT statement
        of the stored procedure.  If there are results, display them.
        If there are no results, display an appropriate message. */
     $row = sqlsrv_fetch( $stmt );
     if( $row )
     {
          do
          {
               ProcessRow( $stmt );
               $row = sqlsrv_fetch( $stmt );
          }while( $row );
     }
     elseif( is_null( $row ))
     {
          echo "The result set is empty.\n";
     }
     elseif( $row === false )
     {
        die( print_r( sqlsrv_errors(), true));
     }
     echo "-------------------\n";
}

/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt1 );
sqlsrv_free_stmt( $stmt2 );
sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );

function ProcessRow( $stmt )
{
     echo "SalesOrderID: ".sqlsrv_get_field($stmt, 0)."\n";
     echo "SalesOrderDetailID: ".sqlsrv_get_field($stmt, 1)."\n";
     echo "ProductID: ".sqlsrv_get_field($stmt, 2)."\n";
     echo "OrderQty: ".sqlsrv_get_field($stmt, 3)."\n\n";
}
?>

Con el fin de que este ejemplo se base en la búsqueda de resultados vacíos, no se buscan errores en todas las llamadas a funciones. Para obtener información sobre el control de errores, vea Controlar errores y advertencias.

Vea también

Conceptos

Comparar las funciones de recuperación de datos
Acerca de ejemplos de código en la documentación

Otros recursos

Recuperar datos
Actualizar datos (Controlador de SQL Server para PHP)
Referencia de la API (Controlador SQL Server para PHP)