存储过程仅部分从PHP执行

0 php sql stored-procedures sql-server-2008

我有一个在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';
Run Code Online (Sandbox Code Playgroud)

这会调用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
Run Code Online (Sandbox Code Playgroud)

如果我从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);
?>
Run Code Online (Sandbox Code Playgroud)

我尝试添加额外的代码行,这使得它在更少的迭代后失败.我确保PHP有足够的内存可以使用,我也检查了PHP和SQL日志无济于事.我们还使用了SQL profiler,它也没有出现任何问题.

Eri*_*lje 6

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