部分執行我有一個在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分析器,它沒有顯示任何問題。
你的PHP可能會超時?代碼需要多長時間才能運行? – andrewsi
感謝您的回覆。正如你所看到的,現在已經成功地回答了這個問題,但是爲了記錄它需要大約0.25秒的運行時間,但是,如果我在其中放入額外的代碼行將花費更少的時間來運行,並且會在循環次數更少後停止。在將SET NOCOUNT ON添加到usp_log存儲過程的開始之後,它可以根據需要成功運行多次迭代。謝謝你的幫助。 – user1401156
就這樣,我知道將來的參考 - 你的程序運行了多少次迭代?我從來沒有遇到過比驅動程序能夠處理更多數據的東西! – andrewsi