1

SQLManagementStudioで正常に実行されるMSSQL2008R2で実行されているストアドプロシージャがあります。ただし、PHPから実行すると、終了する前に実行が停止するようです。SQLでエラーが返されることはなく、PHPエラーログでエラーが返されることもありません。プロシージャは、2番目のストアドプロシージャを使用して、エラーログに何度も書き込むだけです。問題の再現を示すために、コードを単純なループに切り詰めました。これがメインのストアドプロシージャです。

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ストアドプロシージャで使用してみてください。SQLServerのPHPドライバーからPHPに返すことができる結果の数が制限に達している可能性があります。

于 2012-05-17T14:27:19.960 に答える