存储过程仅部分从 PHP 执行


Stored procedure only partially executes from PHP

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

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