在PHP上的EXEC之后,程序返回代码不起作用

时间:2015-03-17 10:34:40

标签: php sql-server stored-procedures

我编写了一个程序,在完成代码后返回代码。我还有一个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;

2 个答案:

答案 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之类的语句,否则返回值不太可能包含任何有用的内容。