MSSQL 預存程序可透過 RETURN 陳述式回傳整數狀態碼(0 表成功、非 0 表錯誤代碼)。PHP 使用 mssql_bind 綁定特殊參數 RETVAL 即可捕獲此回傳值。
<?php
$conn = mssql_connect('server', 'user', 'password');
mssql_select_db('database', $conn);
// 初始化預存程序
$stmt = mssql_init('P__Global_Test', $conn)
or die("初始化預存程序失敗");
// 綁定 RETVAL 參數(重點:參數名稱必須為 "RETVAL",is_output = true)
$returnValue = 0;
mssql_bind($stmt, 'RETVAL', $returnValue, SQLINT4, true);
// 執行
mssql_execute($stmt);
// 判斷回傳值
if ($returnValue === 0) {
echo 'ABCD - 執行成功';
} else {
echo 'EFGH - 執行失敗,錯誤碼:' . $returnValue;
}
mssql_free_statement($stmt);
?>
CREATE PROCEDURE dbo.P__Global_Test
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT * FROM _Test)
BEGIN
RETURN 0; -- 成功
END
ELSE
BEGIN
RETURN 1; -- 失敗/特定錯誤
END
SET NOCOUNT OFF;
END
GO
| 參數 | 說明 |
|---|---|
RETVAL | 固定參數名,對應預存程序的 RETURN 值 |
SQLINT4 | 資料型別:4 位元組整數(對應 MSSQL INT) |
true (第 5 參數) | is_output 必須為 true,表示這是輸出參數 |
<?php
$stmt = mssql_init('usp_GetUser', $conn);
// 綁定輸入參數
mssql_bind($stmt, '@UserID', $userId, SQLINT4, false);
// 綁定輸出參數
mssql_bind($stmt, '@ErrorCode', $errorCode, SQLINT4, true);
mssql_bind($stmt, '@ErrorMsg', $errorMsg, SQLVARCHAR, true, false, 255);
// 綁定 RETVAL
mssql_bind($stmt, 'RETVAL', $retval, SQLINT4, true);
mssql_execute($stmt);
// 處理結果集
while ($row = mssql_fetch_assoc($stmt)) {
// ...
}
echo "RETVAL: $retval, ErrorCode: $errorCode, ErrorMsg: $errorMsg";
?>
mssql_* 函數已在 PHP 7.0 移除,新專案建議使用 PDO_SQLSRV 或 sqlsrv 擴展PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT 綁定輸出參數mssql_next_result() 切換