Sqlsrv 没有读取存储过程的响应

Posted

技术标签:

【中文标题】Sqlsrv 没有读取存储过程的响应【英文标题】:Sqlsrv not reading the response of stored procedure 【发布时间】:2019-07-08 21:34:07 【问题描述】:

我正在使用 sqlsrv 驱动程序,并且从服务器获取数据一直很好,使用“sqlsrv_query”我调用了许多程序并且一切正常,但它不适用于一个程序。

之前所有的 Stores Procedures 只是对数据库进行了选择,但是这个首先在表中插入一些信息,然后返回一个值(我想知道这是否是导致问题的原因)。在这里我无法读取值

我这样称呼SP

$consulta = "exec TP_APP_WEB @CONTRATO = '2007061006201', @AFILIADO = '2007060389', @CODIGO_PRESTADOR = '00018', @OP = 'I'";

然后我使用“sqlsrv_query”或“sqlsrv_execute”执行查询

我正在尝试以多种方式阅读回复:

sqlsrv_fetch sqlsrv_get_field sqlsrv_fetch_object sqlsrv_fetch_array

他们都没有阅读响应。

我没有收到错误,只是空行,响应应该在哪里。

编辑: 这是整个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"```

【问题讨论】:

观看此主题***.com/questions/22641726/… @DaleBurrell 这很简单,只需选择即可返回数据。它适用于所有其他情况,但当我之前有 INSERT 语句时它不起作用。 @DaleBurrell 我添加了整个过程 所以您已经在 SSMS 中测试了 SP,它从 select @NUMERO_ODA "NUMERO_ODA" 行返回了一个值 建议您使用 set nocount on; 开始您的 sp = 可能会有所帮助。 【参考方案1】:

说明:

解释这种意外行为的一个可能原因是您的存储过程可能返回多个结果集。使用sqlsrv_next_result() 激活每个结果。

<?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));
...
?>

注意事项:

如果您有INSERTDELETEUPDATE 语句,则在存储过程中使用SET NOCOUNT ON 作为第一行会阻止将有关受影响行数的信息作为结果集发送。

【讨论】:

以上是关于Sqlsrv 没有读取存储过程的响应的主要内容,如果未能解决你的问题,请参考以下文章

带有命名参数的php sqlsrv_query存储过程

从 Laravel 4 中的 MSSQL 存储过程读取多个结果集

对 mssql 存储过程的金字塔中间件调用 - 无响应

plsql developer 编辑存储过程 未响应

PHP如何调用SQLServer2012的存储过程并获取返回结果集及出参?

oracle 存储过程通过输入条件查询,返回多条记录和记录数。