我有一个在MS SQL 2008 R2中运行的存储过程,它可以在SQL Management Studio中正常运行。但是,如果我从PHP运行它似乎在完成之前停止执行。 SQL中没有返回错误,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 profiler,它也没有出现任何问题。
答案 0 :(得分:6)
尝试在存储过程中使用SET NOCOUNT ON
。您可能会对从sql server PHP驱动程序返回到PHP的结果数量施加限制。