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)