【问题标题】:SQL Server Stored procedure aborting when called from php从 php 调用时 SQL Server 存储过程中止
【发布时间】:2016-02-16 11:13:32
【问题描述】:

我花了好几个小时试图弄清这件事的真相,这让我很兴奋。

我有一个简单的存储过程,只需将 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(内部版本 7601:Service Pack 1)(管理程序)上的标准版(64 位)

我打开了所有错误和警告

有人知道我需要做什么才能完成这项工作吗?

【问题讨论】:

    标签: php sql-server stored-procedures


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-30
      • 2015-05-08
      • 2021-05-26
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多