一時テーブル (#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 つの結果セットを取得する方法はありますか。
前もって感謝します。