2016-09-28 67 views
0

对不起,我的英文很差。这里的问题是:我试图通过sqlsrv驱动程序,SP和输出参数从sql server express 2014中的表中获取PHP中的ID。在使用sqlsrv(PHP)的SP中输出参数遇到问题

当我执行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


编辑:发现一个替代方式来做我想做的事情,用一个SELECT插件理想的SP。然后我就取德结果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 

回答

0

在这个msdn link还有另一种方式来分配你的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 

更紧凑一点..

+0

呃,奇怪,我想我读了一些关于使用'&'的地方。我只是尝试了你所说的,没有任何东西。我设法通过在SP中添加SELECT子句并获取结果来完成此操作。然而,这只是一种替代方法,因此不是在这一点上的答案 –

+0

@NicolasPaz,请尝试在第一个查询中分配“@idExamen”,以便它更紧凑..请参阅我的文章更新 –