5

一時テーブル (#test) を作成し、別のテーブルからのデータを入力し、この一時テーブルで 3 つの選択を実行して削除するストアド プロシージャがあります。

元のテーブルは 20 GB を超えており、3 つの SELECT ステートメントには元の SP のさまざまな条件が含まれています。

SQLSRV を使用して PHP から SP を実行していますが、最初の 2 つの結果セットしか取得できません。

MSSMS から SP を実行すると、問題なく実行され、期待どおりに 3 つの結果セットが返されます。しかし、PHP からは 2 が返されます (すべての組み合わせを試しました)。

これがドライバー、sqlsrv_fetch_array または sqlsrv_next_result に問題があるかどうかはわかりません。

SP の例 (選択ステートメントが大きすぎるため、再開します):

CREATE PROCEDURE sp_transfers
@dt date,
@campaign varchar(16)
AS
BEGIN
CREATE TABLE #test ( [column definitions...] )

BEGIN
INSERT INTO #test SELECT * FROM sometable WHERE dt = @dt AND campaign = @campaign

SELECT * FROM #test ...
SELECT * FROM #test ...
SELECT * FROM #test ...

DROP TABLE #test
END

PHPから、これは私のテストコードです:

$q = sqlsrv_query($conn,"EXEC sp_transfers @dt='2013-10-01',@campaign='1234'");

sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 1st resultset
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 2nd resultset
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); // EMPTY

ただし、これを試してみるとうまくいきます:

sqlsrv_next_result($q);
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 2nd resultset
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); // OK - 3rd resultset shows up

この組み合わせでも同じこと:

sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); //OK - data as expected - 1st resultset
sqlsrv_next_result($q);
sqlsrv_next_result($q);
var_dump(sqlsrv_fetch_array($q)); // OK - 3rd resultset shows up

ここで何か間違ったことをしていますか?または、1 つの SP から 3 つの結果セットを取得する方法はありますか。

前もって感謝します。

4

2 に答える 2

10

私は実際に同様の問題を抱えていて、次のことをうまく機能させることができました:

$result = array();

// Get return value
do {
   while ($row = sqlsrv_fetch_array($query)) {
       // Loop through each result set and add to result array
       $result[] = $row;
   }
} while (sqlsrv_next_result($query));

print_r($result);

do-while ループは、すべての結果を処理します (これを手動で行う必要はありません)。sqlsrv_fetch_array() をループすることが不可欠であるように思われるので、これが本当の答えだと思います。

于 2013-10-03T23:50:10.100 に答える