Bagikan melalui


Cara: Mengambil Parameter Keluaran Menggunakan Driver SQLSRV

Unduh driver PHP

Topik ini menunjukkan cara memanggil prosedur tersimpan di mana satu parameter telah didefinisikan sebagai parameter output. Saat mengambil parameter output atau input/output, semua hasil yang dikembalikan oleh prosedur tersimpan harus digunakan sebelum nilai parameter yang dikembalikan dapat diakses.

Catatan

Variabel yang diinisialisasi atau diperbarui ke jenis null, DateTime, atau stream tidak dapat digunakan sebagai parameter output.

Pemotongan data dapat terjadi ketika jenis aliran seperti SQLSRV_SQLTYPE_VARCHAR('max') digunakan sebagai parameter output. Jenis aliran tidak didukung sebagai parameter output. Untuk jenis non-aliran, pemotongan data dapat terjadi jika panjang parameter output tidak ditentukan atau jika panjang yang ditentukan tidak cukup besar untuk parameter output.

Contoh 1

Contoh berikut memanggil prosedur tersimpan yang mengembalikan penjualan tahunan hingga saat ini oleh karyawan tertentu. Variabel PHP $lastName adalah parameter input dan $salesYTD adalah parameter output.

Catatan

Menginisialisasi $salesYTD ke 0,0 mengatur PHPTYPE yang dikembalikan ke float. Untuk memastikan integritas jenis data, parameter output harus diinisialisasi sebelum memanggil prosedur tersimpan, atau PHPTYPE yang diinginkan harus ditentukan. Untuk informasi tentang menentukan PHPTYPE, lihat Cara: Menentukan Jenis Data PHP.

Karena hanya satu hasil yang dikembalikan oleh prosedur tersimpan, $salesYTD berisi nilai parameter output yang dikembalikan segera setelah prosedur tersimpan dijalankan.

Catatan

Memanggil prosedur tersimpan menggunakan sintaksis kanonis adalah praktik yang direkomendasikan. Untuk informasi selengkapnya tentang sintaksis kanonis, lihat Memanggil Prosedur Tersimpan.

Contoh mengasumsikan bahwa SQL Server dan database AdventureWorks diinstal di komputer lokal. Semua output ditulis ke konsol saat contoh dijalankan dari baris perintah.

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

Catatan

Saat mengikat parameter output ke jenis bigint, jika nilai mungkin berakhir di luar rentang bilangan bulat, Anda harus menentukan jenis bidang SQL-nya sebagai SQLSRV_SQLTYPE_BIGINT. Jika tidak, ini dapat mengakibatkan pengecualian "nilai di luar rentang".

Contoh 2

Sampel kode ini menunjukkan cara mengikat nilai bigint besar sebagai parameter output.

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

?>

Lihat Juga

Cara: Menentukan Arah Parameter Menggunakan Driver SQLSRV

Cara: Mengambil Parameter Input dan Output Menggunakan Driver SQLSRV

Mengambil Data