从php调用时,SQL Server存储过程中止

时间:2016-02-16 11:13:33

标签: php sql-server stored-procedures

我花了好几个小时试图找到它的底部,它正在推动我拉啦。

我有一个简单的存储过程,只需在表中输入10,000行。这样做是因为它需要足够长的时间来证明这一点(大约12秒)。

create table lala (id int not null identity(1,1), txt varchar(100))
go
CREATE PROCEDURE lalatest
AS
BEGIN
    DECLARE @x int;
    SET @x = 10000;
    WHILE @x > 0
    BEGIN
        INSERT INTO lala (txt) VALUES ('blah ' + CAST(@x AS varchar(10)));
        SET @x = @x - 1;
    END;
END;

当我从SQL Server Management Studio中运行存储过程时,会在表中插入10,000行。

当我从php运行它时,它只是在大约150行(行数变化,建议超时问题)后中止,没有错误消息或任何早期完成的迹象

remote query timeout设置默认设置为600秒,所以不是。

php:

$sql = "exec lalatest";
sqlsrv_query($cn, $sql);

我已经尝试在sqlsrv_query行上指定一个超时值(默认情况下应默认为无限期),但没有区别。

我使用的是php 5.6.7

和Microsoft SQL Server 2012(SP3)(KB3072779) - 11.0.6020.0(X64)     2015年10月20日15:36:27     Windows NT 6.1(Build 7601:Service Pack 1)(Hypervisor)上的标准版(64位)

我已启用所有错误和警告

任何人都有任何想法,我需要做些什么来使这项工作?

1 个答案:

答案 0 :(得分:1)

你会相信吗,我已经成功了。我添加了SET NOCOUNT ON作为存储过程的第一行,现在它也可以从php工作。

看起来像受影响的行信息会导致php sqlsrv驱动程序不稳定。奇怪的是它只在一段时间(大约一秒钟)之后才会这样做,或许与刷新消息缓冲区时的某些事情有关。是的,我猜,但这已经解决了问题,所以我很高兴。

CREATE PROCEDURE lalatest
AS
BEGIN
    SET NOCOUNT ON; -- must be added so that it will run from php

    DECLARE @x int;
    SET @x = 10000;
    WHILE @x > 0
    BEGIN
        INSERT INTO lala (txt) VALUES ('blah ' + CAST(@x AS varchar(10)));
        SET @x = @x - 1;
    END;
END;