SQL Server — возникли проблемы с параметрами OUTPUT в SP с sqlsrv (PHP)

Извините за мой плохой английский. Вот проблема: я пытаюсь получить идентификатор в PHP из таблицы в SQL Server Express 2014 через драйвер sqlsrv, SP и выходной параметр.

Когда я выполняю де SP и печатаю выходной параметр через SSMS, все работает просто отлично. Однако, когда я вызываю SP из PHP, 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 ссылка есть другой способ назначить ваш 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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]