Partilhar via


sqlsrv_next_result

Baixar driver PHP

Torna ativo o próximo resultado (conjunto de resultados, contagem de linhas ou parâmetro de saída) da instrução especificada.

Observação

O primeiro (ou único) resultado retornado por uma consulta em lote ou procedimento armazenado está ativo sem uma chamada para sqlsrv_next_result.

Sintaxe

  
sqlsrv_next_result( resource $stmt )  

Parâmetros

$stmt: A instrução executada na qual o próximo resultado é ativado.

Valor de retorno

Se o próximo resultado foi ativado com êxito, o valor booleano true será retornado. Se ocorreu um erro ao ativar o próximo resultado, false será retornado. Se não houver mais resultados disponíveis, null será retornado.

Exemplo 1

O exemplo a seguir cria e executa um procedimento armazenado que insere uma revisão de produto na tabela Production.ProductReview e, em seguida, seleciona todas as revisões para o produto especificado. Após a execução do procedimento armazenado, o primeiro resultado (o número de linhas afetadas pela consulta INSERT no procedimento armazenado) é consumido sem chamar sqlsrv_next_result. O próximo resultado (as linhas retornadas pela consulta SELECT no procedimento armazenado) é disponibilizado chamando sqlsrv_next_result e consumido usando sqlsrv_fetch_array.

Observação

Chamar procedimentos armazenados usando sintaxe canônica é a prática recomendada. Para obter mais informações sobre sintaxe canônica, consulte Chamando um procedimento armazenado.

O exemplo pressupõe que o SQL Server e o banco de dados AdventureWorks estejam instalados no computador local. Toda a saída é gravada no console quando o exemplo é executado a partir da linha de comando.

<?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 affected: ".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 );  
?>  

Ao executar um procedimento armazenado que tenha parâmetros de saída, é recomendável que todos os outros resultados sejam consumidos antes de acessar os valores dos parâmetros de saída. Para obter mais informações , consulte Como especificar a direção do parâmetro usando o driver SQLSRV.

Exemplo 2

O exemplo a seguir executa uma consulta em lote que recupera informações de revisão de produto para uma ID de produto especificada, insere uma revisão para o produto e, em seguida, recupera novamente as informações de revisão de produto para a ID de produto especificada. A revisão do produto recém-inserida será incluída no conjunto de resultados finais da consulta em lote. O exemplo usa sqlsrv_next_result para mover de um resultado da consulta em lote para o próximo.

Observação

O primeiro (ou único) resultado retornado por uma consulta em lote ou procedimento armazenado está ativo sem uma chamada para sqlsrv_next_result.

O exemplo usa a tabela Purchasing.ProductReview do banco de dados AdventureWorks e pressupõe que esse banco de dados esteja instalado no servidor. Toda a saída é gravada no console quando o exemplo é executado a partir da linha de comando.

<?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 );  
?>  

Ver também

Referência da API do driver SQLSRV

Sobre Exemplos de Código na Documentação

Recuperando dados

Atualizando dados (Drivers da Microsoft para PHP para SQL Server)

Aplicação de exemplo (driver SQLSRV)