Partilhar via


Como: Recuperar parâmetros de saída usando o driver SQLSRV

Descarregar o driver PHP

Este tópico demonstra como chamar um procedimento armazenado em que um parâmetro foi definido como parâmetro de saída. Ao recuperar um parâmetro de saída ou entrada/saída, todos os resultados devolvidos pelo procedimento armazenado devem ser consumidos antes de o valor do parâmetro devolvido estar acessível.

Observação

Variáveis que são inicializadas ou atualizadas para tipos nulo, DateTime ou stream não podem ser usadas como parâmetros de saída.

O truncamento de dados pode ocorrer quando tipos de fluxo como SQLSRV_SQLTYPE_VARCHAR('max') são usados como parâmetros de saída. Os tipos de fluxo não são suportados como parâmetros de saída. Para tipos não de fluxo, pode ocorrer truncamento de dados se o comprimento do parâmetro de saída não for especificado ou se o comprimento especificado não for suficientemente grande para o parâmetro de saída.

Exemplo 1

O exemplo seguinte chama um procedimento armazenado que devolve as vendas acumuladas no ano por um determinado colaborador. A variável PHP $lastName é um parâmetro de entrada e $salesYTD é um parâmetro de saída.

Observação

Inicializar $salesYTD em 0.0 faz com que o PHPTYPE devolvido fique flutuante. Para garantir a integridade do tipo de dados, os parâmetros de saída devem ser inicializados antes de chamar o procedimento armazenado, ou deve ser especificado o tipo PHP desejado. Para informações sobre a especificação do PHPTYPE, veja Como: Especificar Tipos de Dados PHP.

Como apenas um resultado é devolvido pelo procedimento armazenado, $salesYTD contém o valor devolvido do parâmetro de saída imediatamente após a execução do procedimento armazenado.

Observação

Chamar procedimentos armazenados usando sintaxe canónica é a prática recomendada. Para mais informações sobre sintaxe canónica, veja Chamar um Procedimento Armazenado.

O exemplo assume que o SQL Server e a base de dados AdventureWorks estão instalados no computador local. Toda a saída é escrita para a consola quando o exemplo é executado a partir da linha de comandos.

<?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('GetEmployeeSalesYTD', 'P') IS NOT NULL  
                DROP PROCEDURE GetEmployeeSalesYTD";  
$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 GetEmployeeSalesYTD  
                   @SalesPerson nvarchar(50),  
                   @SalesYTD money OUTPUT  
                   AS  
                   SELECT @SalesYTD = SalesYTD  
                   FROM Sales.SalesPerson AS sp  
                   JOIN HumanResources.vEmployee AS e   
                   ON e.EmployeeID = sp.SalesPersonID  
                   WHERE LastName = @SalesPerson";  
$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 GetEmployeeSalesYTD( ?, ? )}";  
  
/* Define the parameter array. By default, the first parameter is an  
INPUT parameter. The second parameter is specified as an OUTPUT  
parameter. Initializing $salesYTD to 0.0 sets the returned PHPTYPE to  
float. To ensure data type integrity, output parameters should be  
initialized before calling the stored procedure, or the desired  
PHPTYPE should be specified in the $params array.*/  
$lastName = "Blythe";  
$salesYTD = 0.0;  
$params = array(   
                 array($lastName, SQLSRV_PARAM_IN),  
                 array(&$salesYTD, SQLSRV_PARAM_OUT)  
               );  
  
/* 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));  
}  
  
/* Display the value of the output parameter $salesYTD. */  
echo "YTD sales for ".$lastName." are ". $salesYTD. ".";  
  
/*Free the statement and connection resources. */  
sqlsrv_free_stmt( $stmt1);  
sqlsrv_free_stmt( $stmt2);  
sqlsrv_free_stmt( $stmt3);  
sqlsrv_close( $conn);  
?>  

Observação

Ao atribuir um parâmetro de saída a um tipo bigint, se o valor puder ficar fora do intervalo de um inteiro, terá de especificar o seu tipo de campo SQL como SQLSRV_SQLTYPE_BIGINT. Caso contrário, pode resultar numa exceção de "valor fora do alcance".

Exemplo 2

Este exemplo de código mostra como associar um valor bigint grande como parâmetro de saída.

<?php
$serverName = "(local)";
$connectionInfo = array("Database"=>"testDB");  
$conn = sqlsrv_connect($serverName, $connectionInfo);  
if ($conn === false) {  
    echo "Could not connect.\n";  
    die(print_r(sqlsrv_errors(), true));  
}  

// Assume the stored procedure spTestProcedure exists, which retrieves a bigint value of some large number
// e.g. 9223372036854
$bigintOut = 0;
$outSql = "{CALL spTestProcedure (?)}";
$stmt = sqlsrv_prepare($conn, $outSql, array(array(&$bigintOut, SQLSRV_PARAM_OUT, null, SQLSRV_SQLTYPE_BIGINT)));
sqlsrv_execute($stmt);
echo "$bigintOut\n";   // Expect 9223372036854

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

?>

Ver também

Como: Especificar a Direção dos Parâmetros Usando o Driver SQLSRV

Como: Recuperar Parâmetros de Entrada e Saída Usando o Driver SQLSRV

Recuperação de Dados