2016-02-16 3 views
0

Я потратил часы, пытаясь разобраться в этом, и это заставляет меня ла-ла-ла.SQL Server Сохраненная процедура прерывания при вызове с php

У меня есть простая хранимая процедура, которая вводит только 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 секунд, так что это не так.

РНР:

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

Я попытался указать значение тайм-аута (которое должно быть неопределенным по умолчанию в любом случае) на sqlsrv_query линии, и это не имеет никакого значения.

Я использую PHP 5.6.7

и Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 20 октября 2015 15:36:27 Standard Edition (64-разрядная) на Windows NT 6.1 (сборка 7601: Service Pack 1) (гипервизор)

Я все ошибки и предупреждения включен

Любой есть какие-либо идеи относительно того, что мне нужно сделать, чтобы сделать эту работу?

ответ

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; 
Смежные вопросы