我编写了一个程序,在完成代码后返回代码。我还有一个PHP函数,使用sqlsrv库来获取数据。我能够从SQL Server Management Studio获取正确的返回码,但是,在php代码中,返回码不会使用实际返回值进行更新。
$returncode = 10000;
$procedure = "{call AccountBulkChargeTest( ?, ?, ?, ? )}";
$params = array(
array($username, SQLSRV_PARAM_IN),
array($nonumber, SQLSRV_PARAM_IN),
array($messages, SQLSRV_PARAM_IN),
array($returncode, SQLSRV_PARAM_OUT)
);
$stmt = sqlsrv_query( $this->db, $procedure, $params );
var_dump($returncode);
这将返回以下内容(没有更改,应该是1000:
int(10000)
但是,在SQL Server Management Studio中运行相同的代码: 使用[数据库] GO
DECLARE @return_value int,
@ReturnCode int
EXEC @return_value = [dbo].[AccountBulkChargeTest]
@Username = N'hello',
@Nonumber = 1,
@Messages = N'hello',
@ReturnCode = @ReturnCode OUTPUT
SELECT @ReturnCode as N'@ReturnCode'
SELECT 'Return Value' = @return_value
GO
将@ReturnCode返回为1000,将返回值返回为0;
我的程序如下:
ALTER procedure [dbo].[AccountBulkChargeTest]
(
@Username varchar(32),
@Nonumber int,
@Messages varchar(640),
@ReturnCode int output
)
AS
BEGIN
DECLARE @Value int = 20;
IF(@Value < 25)
BEGIN
SET @ReturnCode = 1000;
UPDATE LOGIN SET BALANCE = BALANCE - 0;
EXEC AccountDoTransaction 0, 0, 0, 0;
RETURN;
END
ELSE IF(@Value < 40)
BEGIN
SET @ReturnCode = 2000;
END
ELSE
BEGIN
SET @ReturnCode = 3000;
END
END
RETURN;
我不应该删除以下行似乎使它工作但我需要能够在上面发布的那个程序中调用该程序:
UPDATE LOGIN SET BALANCE = BALANCE - 0;
EXEC AccountDoTransaction 0, 0, 0, 0;
答案 0 :(得分:0)
您的存储过程需要使用RETURN关键字才能将值返回给@return_value。
根据MSDN文档,您需要使用RETURN @ReturnCode
样式。
答案 1 :(得分:0)
SQL Server stored procedure can return information in a result set, output parameters or an integer return code。整数返回码通常包含受上一个查询影响的记录数。但您可以使用return
statement返回自定义值。
您的存储过程有一个名为@ReturnCode
的输出参数。但变量的名称不会改变其性质。它仍然是输出参数。
您可以尝试使用PHP-semi-SQL语句检索实际返回代码,如:
{call ? = YourProc()}
例如:
$retval = -1;
$par1 = 'will the real return code please stand up';
$procedure = "{call ? = YourProc(?)}";
$params = array(
array($retval, SQLSRV_PARAM_INOUT, SQLSRV_PHPTYPE_INT, SQLSRV_SQLTYPE_INT),
array($par1, SQLSRV_PARAM_IN)
);
$stmt = sqlsrv_query( $this->db, $procedure, $params );
var_dump($retval);
但除非您的过程包含return 42
之类的语句,否则返回值不太可能包含任何有用的内容。