現在の位置: ホーム> 最新記事一覧> next_result()でSQL Serverの複数の結果セットをエレガントに処理する方法

next_result()でSQL Serverの複数の結果セットをエレガントに処理する方法

gitbox 2025-05-06

PHPでSQL Serverを操作する場合(特にSQLSRV拡張機能を使用)、ストアドプロシージャまたはバッチクエリステートメントによって返される状況に遭遇することがよくあります。これらの結果セットを正しく処理するには、 SQLSRV_FETCH_ARRAY()を使用するだけでは不十分な場合、 SQLSRV_NEXT_RESULT()関数を使用する必要があります。この記事では、next_result()をエレガントかつ安全に使用して、返されたすべての結果セットを繰り返す方法について説明します。

next_result()とは何ですか?

SQL Serverでは、クエリは複数の結果セットを返すことができます。たとえば、:

 SELECT * FROM users;
SELECT * FROM orders;

このようなクエリを実行する場合、PHPはSQLSRV_NEXT_RESULT()を使用して、2つの結果セットを反復する必要があります。

基本的な使用方法

まず、簡単な例を見てみましょう。

 <?php
$serverName = "localhost";
$connectionOptions = array(
    "Database" => "MyDatabase",
    "Uid" => "myuser",
    "PWD" => "mypassword"
);

// 接続を確立します
$conn = sqlsrv_connect($serverName, $connectionOptions);
if ($conn === false) {
    die(print_r(sqlsrv_errors(), true));
}

// 複数の結果セットを実行します SQL クエリ
$sql = "SELECT * FROM users; SELECT * FROM orders;";
$stmt = sqlsrv_query($conn, $sql);

if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}

$resultIndex = 1;

do {
    echo "を処理します {$resultIndex} 結果セット:\n";
    while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
        print_r($row);
    }
    $resultIndex++;
} while (sqlsrv_next_result($stmt));

// 無料のリソース
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
?>

使用シナリオの例:ページングクエリとストアドプロシージャ

一部のエンタープライズアプリケーションでは、一般的に使用されるストアドプロシージャにページングを実装します。このタイプのストアドプロシージャは、多くの場合、2つの結果セットを返します。1つはデータリストであり、もう1つは総数のレコードです。

 -- ページングストアドプロシージャを仮定する
CREATE PROCEDURE GetPagedUsers
AS
BEGIN
    SELECT * FROM users ORDER BY id OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY;
    SELECT COUNT(*) AS TotalCount FROM users;
END

PHPで処理すると、これを行うことができます。

 $sql = "{CALL GetPagedUsers()}";
$stmt = sqlsrv_query($conn, $sql);

if ($stmt === false) {
    die(print_r(sqlsrv_errors(), true));
}

// 第一結果セット:データリスト
$users = [];
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
    $users[] = $row;
}

// 移动到下一結果セット
if (sqlsrv_next_result($stmt)) {
    // 第二結果セット:総記録
    if ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
        $totalCount = $row['TotalCount'];
    }
}

print_r([
    'users' => $users,
    'totalCount' => $totalCount,
]);

注意すべきこと

  • リソースリリース:最後にsqlsrv_free_stmt()に電話して、ステートメントリソースをリリースしてください。

  • 結果セットの順序は明確にする必要があります。複数の結果セットの順序は、SQLの順序によって完全に決定されます。

  • 空の結果セットを防ぐsqlsrv_next_result()を呼び出した後、新しいデータが返されたかどうかを確認する必要があります。

まとめ

SQLSRV_NEXT_RESULT()を合理的に使用することにより、SQL Serverによって返される複数の結果セットを優雅に処理でき、ページング、統計、マージクエリなどのビジネスシナリオで大きな役割を果たします。生産環境でそのようなインターフェイスを呼び出すときは、システムの安定した動作を確保するためにエラー処理とリソースリリースの良い仕事をする必要があります。

SQL ServerとPHPの組み合わせの詳細については、公式ドキュメントまたはチュートリアルプラットフォームhttps://gitbox.net/php-sqlserverにアクセスできます。