2012-05-17 56 views
0

部分執行我有一個在MS SQL 2008 R2中運行的存儲過程,可以在SQL Management Studio中正常運行。但是,如果我從PHP運行它似乎停止執行之前完成。在SQL中沒有返回錯誤,並且在PHP錯誤日誌中沒有返回錯誤。該過程只需使用第二個存儲過程多次寫入錯誤日誌。我已將代碼縮減爲簡單的循環來演示再現問題。這是主要的存儲過程。存儲過程只能從PHP

ALTER PROCEDURE [dbo].[usp_failure_test] 

AS 
DECLARE 
@counter int, 
@message nvarchar(100) 

SET @counter = 0; 
WHILE @counter < 100 
    BEGIN 
    SET @message = 'COUNT: ' + CAST(@counter AS nvarchar); 
    EXEC usp_log 0, 'TEST', @message; 
    SET @counter += 1; 
    END 
EXEC usp_log 0, 'TEST', 'Finished'; 

這就要求usp_log

ALTER PROCEDURE [dbo].[usp_log] 
@engine_id int, 
@type nvarchar(15), 
@message text 
AS 
DECLARE 
@last int, 
@log_size int 

INSERT INTO [dbo].[log] (engine_id, timestamp, type, message) VALUES (@engine_id, getdate(), @type, @message); 
SET @log_size = CONVERT(int, (dbo.get_setting('log_size'))) 
SET @last = (SELECT TOP 1 id FROM log ORDER BY id DESC) 
DELETE FROM log WHERE id < (@last - @log_size) 
return 

如果我從SSMS執行usp_failure測試寫入所有預期的日誌條目,然後成功地停止該過程。但是,如果我從PHP執行它(使用下面的代碼),它只能達到52,然後停下來沒有任何線索爲什麼。

<?php 
$servername = "localhost\sqlexpress"; 
$connectionInfo = array("UID" => "xxx", "PWD" => "xxx", "Database"=>"xxx", "ReturnDatesAsStrings"=>true, "CharacterSet" =>"UTF-8"); 
$conn = @sqlsrv_connect($servername, $connectionInfo); 
$query = "usp_failure_test"; 
$params = array(); 
$result = sqlsrv_query($conn, $query, $params); 
?> 

我已經嘗試添加額外的代碼行,這使得它在更少的迭代後失敗。我已經確保PHP有足夠的內存可用,並且我也檢查了PHP和SQL日誌無濟於事。我們還使用了SQL分析器,它沒有顯示任何問題。

+0

你的PHP可能會超時?代碼需要多長時間才能運行? – andrewsi

+0

感謝您的回覆。正如你所看到的,現在已經成功地回答了這個問題,但是爲了記錄它需要大約0.25秒的運行時間,但是,如果我在其中放入額外的代碼行將花費更少的時間來運行,並且會在循環次數更少後停止。在將SET NOCOUNT ON添加到usp_log存儲過程的開始之後,它可以根據需要成功運行多次迭代。謝謝你的幫助。 – user1401156

+0

就這樣,我知道將來的參考 - 你的程序運行了多少次迭代?我從來沒有遇到過比驅動程序能夠處理更多數據的東西! – andrewsi

回答

5

在存儲過程中嘗試使用SET NOCOUNT ON。您可能會對從sql server PHP驅動程序返回到PHP的結果數量造成限制。

+0

輝煌而快速!你已經發現了 - 我現在已經對1000多次迭代進行了很好的測試。謝謝。只有一件事,是否有必要將這個附加到所有存儲過程的開始或僅從PHP調用的那個開始?再次感謝。 – user1401156

+0

@user - 通常情況下,我會在所有存儲過程的開始處放入它,除非有某些原因讓我希望看到「受影響的x行」消息(例如,在調試過程中)。 –

+0

再次感謝。你爲我節省了很多工作。和頭髮! :-) – user1401156