0

对不起我糟糕的英语。这是问题所在:我正在尝试通过 sqlsrv 驱动程序、SP 和输出参数从 sql server express 2014 中的表中接收 PHP 中的 ID。

当我执行 de SP 并通过 SSMS 打印输出参数时,一切正常。但是,当我从 PHP 调用 SP 时,会执行 SP,但输出参数不会改变。

这是SP:

ALTER PROCEDURE [dbo].[SiguientePaciente](
    @IdExamen int OUTPUT
) AS
BEGIN
    SET NOCOUNT ON

    SET @IdExamen = (SELECT TOP 1 T.IdExamen FROM TURNOS T WHERE T.Estado = 0 ORDER BY T.FechaHora ASC)

    UPDATE TURNOS SET Estado = 1 WHERE IdExamen = @IdExamen

    RETURN
END

这是 PHP,假设$conexion有效:

$idExamen = 0;
$sql = "{CALL SiguientePaciente (?)}";
$params = [&$idExamen, SQLSRV_PARAM_OUT, SQLSRV_PHPTYPE_INT, SQLSRV_SQLTYPE_INT];
$stmt = sqlsrv_query($conexion, $sql, $params);
if($stmt !== false){
    //sqlsrv_next_result($stmt);
    echo $idExamen;
}
else
    echo print_r(sqlsrv_errors(), true);

最后,echo $idExamen打印0


编辑:找到了另一种方法来做我想做的事,在 SP 中使用 SELECT。然后我只是在 PHP 中获取结果

ALTER PROCEDURE [dbo].[SiguientePaciente](
    @IdExamen int OUTPUT
) AS
BEGIN
    SET NOCOUNT ON

    SET @IdExamen = (SELECT TOP 1 T.IdExamen FROM TURNOS T WHERE T.Estado = 0 ORDER BY T.FechaHora ASC)

    UPDATE TURNOS SET Estado = 1 WHERE IdExamen = @IdExamen

    SELECT @IdExamen AS IdExamen
    RETURN;
END
4

1 回答 1

0

在这个msdn 链接上,还有另一种分配 php$params数组的方法。我尝试使该表格适应您的情况:

$params = array(   
                 array($idExamen, SQLSRV_PARAM_OUT)  
               );   

似乎不需要在传递时将引用运算符(我认为)应用于输出变量,以及与参数相关的其他 php 常量..

评论后更新

也试试

SELECT TOP 1 @IdExamen = T.IdExamen FROM TURNOS T WHERE T.Estado = 0 ORDER BY T.FechaHora ASC

它更紧凑..

于 2016-09-28T15:06:13.773 回答