1

我有一个在 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 分析器,它也没有出现任何问题。

4

1 回答 1

7

尝试SET NOCOUNT ON在您的存储过程中使用。您可能会遇到可以从 sql server PHP 驱动程序返回到 PHP 的结果数量的限制。

于 2012-05-17T14:27:19.960 回答