I am using the sqlsrv driver and I have been getting data from the server just fine, using "sqlsrv_query" I have called many procedures and everything works fine, but it does not work with one procedure.
All the previous Stores Procedures just made selects to the database, but this one first inserts some info in the table and then it returns a value (I wonder if this is what is causing the issue). And here I can't read the value
I call the SP like this
$consulta = "exec TP_APP_WEB @CONTRATO = '2007061006201', @AFILIADO = '2007060389', @CODIGO_PRESTADOR = '00018', @OP = 'I'";
and then I execute the query using "sqlsrv_query" or "sqlsrv_execute"
and I am trying to read the response in many ways:
sqlsrv_fetch sqlsrv_get_field sqlsrv_fetch_object sqlsrv_fetch_array
and none of them read the response.
I am getting no error, just empty rows, where the response should be.
EDIT: This is the whole SP
select @maximo = max(orde_nume) from cap_tbl_orden_atencion where orde_sucu = '001'
select
@anio_contrato = afco_anio, @mes_contrato = afco_mes, @tipo_contrato = afco_tipo, @numero_contrato = afco_nume, @anio_afiliado = afco_afan,
@mes_afiliado = afco_afme, @numero_afiliado = afco_afnu, @plan = afco_plan, @porcentaje = porc_red, @codigo_contratante = CONT_CONT
from
cap_tbl_afiliado_por_contrato
inner join cap_tbl_copago_por_plan on afco_plan = cod_plan AND tipo_prestacion = '0101' and cobertura = '00'
INNER JOIN CAP_TBL_CONTRATOS ON CONT_ANIO+CONT_MES+CONT_TIPO+CONT_NUME = afco_anio+afco_mes+afco_tipo+afco_nume
where
afco_anio+afco_mes+afco_tipo+afco_nume = @contrato and afco_afan+afco_afme+afco_afnu = @AFILIADO and afco_esta = 'A'
select @periodo = max(periodo) from CAP_TBL_PERIODO_POR_CONTRATO where anio+mes+tipo+contrato = @CONTRATO
if @maximo is null
set @maximo = 0
set @maximo = @maximo +1
set @NUMERO_ODA = right('0000000'+convert(varchar(7), @maximo), 7)
SELECT @DESC_MOTIVO= 'ODA : '+@NUMERO_ODA, @fecha = getdate()
IF @MAXIMO2 IS NULL
SET @MAXIMO2 = 0
SET @MAXIMO2 = @MAXIMO2 +1
INSERT INTO CAP_TBL_AUTORIZACION_PROCESO
VALUES('001', @MAXIMO2, 54, @FECHA, @NUMERO_ODA, 0, 0, @desc_motivo, @DESC_MOTIVO, '197', '000', 0, 'A', GETDATE(), @anio_contrato, @mes_contrato,
@tipo_contrato, @numero_contrato)
insert into cap_tbl_orden_atencion
values ('001', @NUMERO_ODA, '01', GETDATE(), @CODIGO_PRESTADOR, @TIPO_PRESTADOR, @anio_contrato, @mes_contrato, @tipo_contrato, @numero_contrato,
@codigo_contratante, @tipo_contrato, @anio_afiliado, @mes_afiliado, @numero_afiliado, '', '', '', '', '0101', @porcentaje, @VALOR_ODA, 0, @valor_oda,
@VALOR_AFILIADO, @VALOR_CUBIERTO, @VALOR_CUBIERTO, @VALOR_AFILIADO, 'ODA WEB', 'C', 'A', '197', 'Z01', @TIPO_PRESTADOR, @CODIGO_PRESTADOR, @PLAN, '01',
0, @periodo, GETDATE(), 'N', '001', 0, DATEPART(YEAR, GETDATE()), DATEPART(MONTH, GETDATE()), DATEPART(DAY, GETDATE()), '00',
0, 0, 0, DATEPART(YEAR, GETDATE()), DATEPART(MONTH, GETDATE()), DATEPART(DAY, GETDATE()), '000', 0, 0, 0, '000',
0, '197', GETDATE(), '197', GETDATE(), '0101', '', '01', '01', 'N', '001', 0, 'WEB', 0, '01', '01')
SET @PRESTACION = '01-01-01-99961'
if (@plan = 1 and @PLAN_PRESTADOR = 1) or (@plan = 2 and @PLAN_PRESTADOR = 2) or (@plan = 2 and @PLAN_PRESTADOR = 1)
SET @PRESTACION = '01-01-01-99961'
IF @PLAN = 1 AND @PLAN_PRESTADOR = 2
SET @PRESTACION = '01-01-01-99993'
IF @PLAN = 1 AND @PLAN_PRESTADOR = 3
SET @PRESTACION = '01-01-01-99994'
IF @PLAN = 2 AND @PLAN_PRESTADOR = 3
SET @PRESTACION = '01-01-01-99995'
IF @PLAN = 3 AND @PLAN_PRESTADOR = 1
SET @PRESTACION = '01-01-01-99989'
IF @PLAN = 3 AND @PLAN_PRESTADOR = 2
SET @PRESTACION = '01-01-01-99988'
IF @PLAN = 3 AND @PLAN_PRESTADOR = 3
SET @PRESTACION = '01-01-01-99962'
INSERT INTO
CAP_TBL_DETALLE_ADICIONAL_ORDEN
VALUES( '001' , @NUMERO_ODA , 'PR' , 1 , '01' , '01', @PRESTACION , @VALOR_ODA , @PORCENTAJE , @VALOR_CUBIERTO , @VALOR_AFILIADO , '0101',
'A',@VALOR_ODA,3.29, @PLAN , '01' , 'Z10' , @tipo_prestador , @CODIGO_PRESTADOR , 1 , @VALOR_ODA , @VALOR_ODA, 0, @VALOR_ODA, @VALOR_ODA, 0, 0,
@VALOR_ODA, @porcentaje, @VALOR_AFILIADO, @VALOR_CUBIERTO)
update a
set a.periodo_contrato = b.periodo
from cap_tbl_ORDEN_ATENCION a,cap_tbl_periodos_por_contrato b
where a.ORDE_SUCU = '001' and a.ORDE_NUME = @NUMERO_ODA and
a.ORDE_FECH between fecha_inicio and fecha_final and a.ORDE_COAN = B.anio and
a.ORDE_COME = B.mes and a.ORDE_COTI = B.tipo and a.ORDE_CONU = B.contrato
insert into tbl_consumos
select sucursal,NUMERO,cod_cobertura,tipoprestacion,'000',sum(a.COBERTURA)
from
cap_tbl_detalle_ADICIONAL_ORDEN a
where a.sucursal = '001' and A.NUMERO = @NUMERO_ODA
group by
sucursal,A.NUMERO,cod_cobertura,TIPOPRESTACION
select @tipo_s = sec_factura from CARTERA..ccb_tbl_caja where caja_sucu = '001' and usuario = 197
SELECT @MAXIMO = SECUENCIA FROM CARTERA..CCB_TBL_SECUENCIA WHERE sucursal = '001' and TIPO = 'CA'
IF @MAXIMO IS NULL
SET @MAXIMO = 0
SET @MAXIMO = @MAXIMO +1
SELECT @NUMERO_FACTURA = SECUENCIA
,@NRO_DOCUMENTO_P1= SECUENCIA_P1,@NRO_DOCUMENTO_P2= SECUENCIA_P2,@NRO_AUTORIZACION = 0
FROM CARTERA..CCB_TBL_SECUENCIA WHERE
sucursal = '001' and
TIPO = @TIPO_S
IF @NUMERO_FACTURA IS NULL
SET @NUMERO_FACTURA = 0
SET @NUMERO_FACTURA = @NUMERO_FACTURA +1
SET @NRO_DOCUMENTO_P3= RIGHT('0000000'+CONVERT(VARCHAR(10),@NUMERO_FACTURA),7)
INSERT INTO CARTERA..CCB_TBL_CABECERA_RECIBO_CAJA
VALUES('001', @MAXIMO, convert(date,@FECHA), @anio_contrato, @mes_contrato, @tipo_contrato, @numero_contrato, @codigo_contratante,
@VALOR_AFILIADO, 0, 0,0, 0,@VALOR_AFILIADO, '00', @fecha, 0, 'NV',@TIPO_S, @NUMERO_FACTURA, 'O', @NRO_DOCUMENTO_P1,@NRO_DOCUMENTO_P2,@NRO_DOCUMENTO_P3,
@NRO_AUTORIZACION, @anio_afiliado,@mes_afiliado,@numero_afiliado,'O','O','001',0, 197,@FECHA,197, @fecha,
CASE WHEN @TIPO_S IN ('F28','F30','F31','F32','F33','F34','F35','F36','F37') THEN 'I' ELSE NULL END ,NULL,NULL,NULL,NULL,NULL,NULL,NULL ,'C'
)
UPDATE CARTERA..CCB_TBL_SECUENCIA SET SECUENCIA = SECUENCIA +1
WHERE sucursal = '001' and TIPO = 'CA'
UPDATE CARTERA..CCB_TBL_SECUENCIA SET SECUENCIA = SECUENCIA +1
WHERE sucursal = '001' and TIPO = @TIPO_S
INSERT INTO CARTERA..CCB_TBL_DETALLE_RECIBO_CAJA
VALUES('001', @MAXIMO, 1, @anio_contrato,@mes_contrato,@tipo_contrato,@numero_contrato,'03','001',@NUMERO_ODA,@VALOR_AFILIADO)
EXEC CARTERA..CCB_PRO_MAN_DETALLE_RECIBO_CAJA 'F', '001', @maximo
INSERT INTO CARTERA..CCB_TBL_FORMA_PAGO_RECIBO
VALUES('001', 'OD', @MAXIMO, 1, '03', 'TJ', @ENTIDAD, @CUENTA, 0, @VALOR_AFILIADO, '00',0, convert(date,@FECHA) ,
'A', @fecha, 0,0, '090', '000', '197', @fecha,'197',@fecha ,'' ,'N','N',1)
select @NUMERO_ODA "NUMERO_ODA"```
Explanations:
One possible reason, that explains this unexpected behavior, is that your stored procedure probably returns multiple result sets. Use sqlsrv_next_result() to make each result active.
<?php
...
// Call stored procedure
$sql = "exec TP_APP_WEB @CONTRATO = '2007061006201', @AFILIADO = '2007060389', @CODIGO_PRESTADOR = '00018', @OP = 'I'";
$stmt = sqlsrv_query($conn, $sql);
if ($stmt === false) {
echo "Error (sqlsrv_query): ".print_r(sqlsrv_errors(), true);
exit;
}
// Fetch data
do {
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
print_r($row, true);
}
} while (sqlsrv_next_result($stmt));
...
?>
Notes:
If you have INSERT
, DELETE
or UPDATE
statements, using SET NOCOUNT ON as first row in your stored procedure prevents sending information about the count of the affected rows as result set.