我花了好几个小时试图找到它的底部,它正在推动我拉啦。
我有一个简单的存储过程,只需在表中输入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位)
我已启用所有错误和警告
任何人都有任何想法,我需要做些什么来使这项工作?
答案 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;