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));
...
?>
注意事项:
如果您有INSERT
、DELETE
或UPDATE
语句,则在存储过程中使用SET NOCOUNT ON 作为第一行会阻止将有关受影响行数的信息作为结果集发送。
【讨论】:
以上是关于Sqlsrv 没有读取存储过程的响应的主要内容,如果未能解决你的问题,请参考以下文章
从 Laravel 4 中的 MSSQL 存储过程读取多个结果集