sqlsrv_next_result
Active le résultat suivant (jeu de résultats, nombre de lignes ou paramètre de sortie) de l’instruction spécifiée.
Notes
Le premier (ou unique) résultat retourné par une requête par lot ou une procédure stockée est actif sans appel à sqlsrv_next_result.
Syntaxe
sqlsrv_next_result( resource $stmt )
Paramètres
$stmt: instruction exécutée sur laquelle le résultat suivant devient actif.
Valeur de retour
Si le résultat suivant est correctement devenu actif, la valeur booléenne true est retournée. Si une erreur s’est produite pour rendre le résultat suivant actif, false est retourné. Si aucun autre résultat n’est disponible, Null est retourné.
Exemple 1
L’exemple suivant crée et exécute une procédure stockée qui insère une évaluation de produit dans la table Production.ProductReview , puis sélectionne toutes les évaluations concernant le produit spécifié. Après l’exécution de la procédure stockée, le premier résultat (le nombre de lignes affectées par la requête INSERT dans la procédure stockée) est consommé sans appeler sqlsrv_next_result. Le résultat suivant (lignes retournées par la requête SELECT dans la procédure stockée) est rendu disponible en appelant sqlsrv_next_result et consommé en utilisant sqlsrv_fetch_array.
Notes
Appeler les procédures stockées à l’aide de la syntaxe canonique est la pratique recommandée. Pour plus d’informations sur la syntaxe canonique, consultez Appel d’une procédure stockée.
L’exemple part du principe que SQL Server et la base de données AdventureWorks sont installés sur l’ordinateur local. Toute la sortie est écrite dans la console quand l’exemple est exécuté à partir de la ligne de commande.
<?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('InsertProductReview', 'P') IS NOT NULL
DROP PROCEDURE InsertProductReview";
$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 InsertProductReview
@ProductID int,
@ReviewerName nvarchar(50),
@ReviewDate datetime,
@EmailAddress nvarchar(50),
@Rating int,
@Comments nvarchar(3850)
AS
BEGIN
INSERT INTO Production.ProductReview
(ProductID,
ReviewerName,
ReviewDate,
EmailAddress,
Rating,
Comments)
VALUES
(@ProductID,
@ReviewerName,
@ReviewDate,
@EmailAddress,
@Rating,
@Comments);
SELECT * FROM Production.ProductReview
WHERE ProductID = @ProductID;
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 InsertProductReview(?, ?, ?, ?, ?, ?)}";
/* Define the parameter array. */
$productID = 709;
$reviewerName = "Customer Name";
$reviewDate = "2008-02-12";
$emailAddress = "customer@email.com";
$rating = 3;
$comments = "[Insert comments here.]";
$params = array(
$productID,
$reviewerName,
$reviewDate,
$emailAddress,
$rating,
$comments
);
/* Execute the query. */
$stmt3 = sqlsrv_query( $conn, $tsql_callSP, $params);
if( $stmt3 === false)
{
echo "Error in executing statement 3.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Consume the first result (rows affected by INSERT query in the
stored procedure) without calling sqlsrv_next_result. */
echo "Rows affectd: ".sqlsrv_rows_affected($stmt3)."-----\n";
/* Move to the next result and display results. */
$next_result = sqlsrv_next_result($stmt3);
if( $next_result )
{
echo "\nReview information for product ID ".$productID.".---\n";
while( $row = sqlsrv_fetch_array( $stmt3, SQLSRV_FETCH_ASSOC))
{
echo "ReviewerName: ".$row['ReviewerName']."\n";
echo "ReviewDate: ".date_format($row['ReviewDate'],
"M j, Y")."\n";
echo "EmailAddress: ".$row['EmailAddress']."\n";
echo "Rating: ".$row['Rating']."\n\n";
}
}
elseif( is_null($next_result))
{
echo "No more results.\n";
}
else
{
echo "Error in moving to next result.\n";
die(print_r(sqlsrv_errors(), true));
}
/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt1 );
sqlsrv_free_stmt( $stmt2 );
sqlsrv_free_stmt( $stmt3 );
sqlsrv_close( $conn );
?>
Quand vous exécutez une procédure stockée qui possède des paramètres de sortie, il est préférable que tous les autres résultats soient consommés avant d’accéder aux valeurs des paramètres de sortie. Pour plus d’informations, consultez Procédure : spécifier la direction du paramètre à l’aide du pilote SQLSRV.
Exemple 2
L’exemple suivant exécute une requête par lot qui récupère des informations d’évaluation de produit relatives à un ID de produit spécifique, insère une évaluation du produit, puis récupère à nouveau les informations d’évaluation de produit relatives à l’ID de produit spécifié. La nouvelle évaluation de produit insérée est incluse dans le jeu de résultats final de la requête par lot. L’exemple utilise sqlsrv_next_result pour passer d’un résultat de la requête par lot au suivant.
Notes
Le premier (ou unique) résultat retourné par une requête par lot ou une procédure stockée est actif sans appel à sqlsrv_next_result.
L’exemple utilise la table Purchasing.ProductReview de la base de données AdventureWorks. Il part du principe que cette base de données est installée sur le serveur. Toute la sortie est écrite dans la console quand l’exemple est exécuté à partir de la ligne de commande.
<?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));
}
/* Define the batch query. */
$tsql = "--Query 1
SELECT ProductID, ReviewerName, Rating
FROM Production.ProductReview
WHERE ProductID=?;
--Query 2
INSERT INTO Production.ProductReview (ProductID,
ReviewerName,
ReviewDate,
EmailAddress,
Rating)
VALUES (?, ?, ?, ?, ?);
--Query 3
SELECT ProductID, ReviewerName, Rating
FROM Production.ProductReview
WHERE ProductID=?;";
/* Assign parameter values and execute the query. */
$params = array(798,
798,
'CustomerName',
'2008-4-15',
'test@customer.com',
3,
798 );
$stmt = sqlsrv_query($conn, $tsql, $params);
if( $stmt === false )
{
echo "Error in statement execution.\n";
die( print_r( sqlsrv_errors(), true));
}
/* Retrieve and display the first result. */
echo "Query 1 result:\n";
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC ))
{
print_r($row);
}
/* Move to the next result of the batch query. */
sqlsrv_next_result($stmt);
/* Display the result of the second query. */
echo "Query 2 result:\n";
echo "Rows Affected: ".sqlsrv_rows_affected($stmt)."\n";
/* Move to the next result of the batch query. */
sqlsrv_next_result($stmt);
/* Retrieve and display the third result. */
echo "Query 3 result:\n";
while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_NUMERIC ))
{
print_r($row);
}
/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );
?>
Voir aussi
Informations de référence sur l’API du pilote SQLSRV
À propos des exemples de code dans la documentation
Mise à jour des données (Pilotes Microsoft pour PHP pour SQL Server)