Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit onderwerp wordt gedemonstreerd hoe u een opgeslagen procedure aanroept waarin één parameter is gedefinieerd als een uitvoerparameter. Bij het ophalen van een uitvoer- of invoer-/uitvoerparameter moeten alle resultaten die door de opgeslagen procedure worden geretourneerd, worden gebruikt voordat de geretourneerde parameterwaarde toegankelijk is.
Opmerking
Variabelen die zijn geïnitialiseerd of bijgewerkt naar null-, DateTime- of stroomtypen, kunnen niet worden gebruikt als uitvoerparameters.
Het afkappen van gegevens kan optreden wanneer stroomtypen zoals SQLSRV_SQLTYPE_VARCHAR('max') worden gebruikt als uitvoerparameters. Stroomtypen worden niet ondersteund als uitvoerparameters. Voor niet-streamtypen kunnen gegevens worden afgekapt als de lengte van de uitvoerparameter niet is opgegeven of als de opgegeven lengte niet voldoende groot is voor de uitvoerparameter.
Voorbeeld 1
In het volgende voorbeeld wordt een opgeslagen procedure aangeroepen waarmee de omzet van het jaar tot heden wordt geretourneerd voor een opgegeven werknemer. De PHP-variabele $lastName is een invoerparameter en $salesYTD een uitvoerparameter is.
Opmerking
Als u $salesYTD initialiseert op 0.0, wordt het geretourneerde PHPTYPE ingesteld op float. Om de integriteit van het gegevenstype te waarborgen, moeten uitvoerparameters worden geïnitialiseerd voordat de opgeslagen procedure wordt aangeroepen, of moet het gewenste PHPTYPE worden opgegeven. Zie Hoe kunt u PHP-gegevenstypen opgeven voor informatie over het opgeven van het PHPTYPE.
Omdat er slechts één resultaat wordt geretourneerd door de opgeslagen procedure, bevat $salesYTD de geretourneerde waarde van de uitvoerparameter direct nadat de opgeslagen procedure is uitgevoerd.
Opmerking
Het aanroepen van opgeslagen procedures met behulp van canonieke syntaxis is de aanbevolen procedure. Zie Een opgeslagen procedure aanroepen voor meer informatie over canonieke syntaxis.
In het voorbeeld wordt ervan uitgegaan dat SQL Server en de AdventureWorks-database op de lokale computer zijn geïnstalleerd. Alle uitvoer wordt naar de console geschreven wanneer het voorbeeld via de opdrachtregel wordt uitgevoerd.
<?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);
?>
Opmerking
Wanneer u een uitvoerparameter aan een bigint-type bindt, moet u het SQL-veldtype opgeven als SQLSRV_SQLTYPE_BIGINT als de waarde buiten het bereik van een geheel getal terechtkomt. Anders kan dit resulteren in een uitzondering 'waarde buiten bereik'.
Voorbeeld 2
In dit codevoorbeeld ziet u hoe u een grote bigint-waarde koppelt als uitvoerparameter.
<?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);
?>
Zie ook
Procedure: Parameterrichting opgeven met behulp van het SQLSRV-stuurprogramma
Procedure: Invoer- en uitvoerparameters ophalen met behulp van het SQLSRV-stuurprogramma