次の方法で共有


空の結果セットを検出する方法

このトピックでは、SQL Server Driver for PHP を使用している場合に結果セットが空かどうかを確認する方法について説明します。

注意

SQL Server Driver for PHP Version 1.1 を使用している場合、sqlsrv_has_rows を使用して結果セットに行があるかどうかを確認できます。

SQL Server Driver for PHP Version 1.0 の場合、ステートメントの結果セットが空かどうかを確認するには、sqlsrv_fetchsqlsrv_fetch_array、または sqlsrv_fetch_object をステートメントに対して呼び出して、返される値を調べることをお勧めします。アクティブな結果セットに結果が含まれていない場合は null が返されます。空の結果セットを返すステートメントではなく、結果セットを返さないステートメントでこれらの関数のいずれかを呼び出す場合、false が返されることに注意してください。

sqlsrv_fetchsqlsrv_fetch_array、または sqlsrv_fetch_object を使用する場合、これらのいずれかの関数に対する呼び出しを行う前に、データの各行を処理するコードを含める必要があります。フェッチされた各行は、これらの関数に対する次の呼び出しが行われた後は使用できなくなります。

このトピックでは 2 つの例を示します。1 つ目の例では、単純なクエリを複数回実行する場合に結果セットが空かどうかを確認します。2 つ目の例では、ストアド プロシージャによって返される結果セットが空かどうかを確認します。

次の例は、sqlsrv_fetch_array を使用して結果セットが空かどうかを確認する方法を示しています。この例では、毎回異なるパラメーター値を使用してクエリを複数回実行します。クエリの 2 回目の実行 (パラメーター値として "X" を使用) で空の結果セットが返されます。結果が含まれている結果セットの各行は、関数 (ProcessRow) を使用して処理されます。結果セットが空の場合は、"The result set is empty" というメッセージが出力されます。

この例では、SQL Server と AdventureWorks データベースがローカル コンピューターにインストールされていることを前提としています。この例をコマンド ラインから実行した場合、すべての出力はコンソールに書き込まれます。

<?php
/*Connect to the local server using Windows Authentication and specify
the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
if( !($conn = sqlsrv_connect( $serverName, $connectionInfo)))
{
     echo "Could not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Define the Tranasact-SQL query. */
$tsql = "SELECT EmailAddress FROM Person.Contact where LastName = ?";

/* Set up an array of parameter arrays. */
$param_arrays = array(
                      array("Jacobson"), 
                      array("X"), 
                      array("Akers")
                     );

/* Execute the query for each parameter array. */
foreach( $param_arrays as $params )
{
     if( !($stmt = sqlsrv_query($conn, $tsql, $params)))
     {
          echo "Error in statement execution.\n";
          die( print_r( sqlsrv_errors(), true));
     }

     echo "Results for LastName = $params[0]:\n";

     /* Determine if there are results.  If there are results, display
        them. If there are no results, display an appropriate message.
        If an error occured, display the error message.*/
     $row = sqlsrv_fetch_array( $stmt );
     if( $row )
     {
          /* Process each row of the result set and retrieve the next
             row.*/
          do
          {
               ProcessRow( $row ); 
               $row = sqlsrv_fetch_array( $stmt );
          } while( $row );
     }
     elseif( is_null($row))
     {
          echo "The result set is empty.\n";
     }
     elseif( $row === false )
     {
          die(print_r( sqlsrv_errors(), true ));
     }
     echo "----------------\n";
}

/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn);

/* Function for processing a row of data. */
function ProcessRow( $row )
{
     echo $row[0]."\n";
}
?>

この例では、結果が空かどうかの確認に重点を置くために、一部の関数のエラー チェックが省略されています。エラーの処理については、「エラーおよび警告の処理」を参照してください。

次の例は、sqlsrv_fetch を使用して結果セットが空かどうかを確認する方法を示しています。この例では、毎回異なるパラメーター値を使用してストアド プロシージャを複数回実行します。このストアド プロシージャは、販売注文の品目 (SalesOrderID) を削除し、対応する製品 ID の在庫エントリを更新して、販売注文の残りの品目を返します。クエリの 2 回目の実行 (パラメーター値として "121293" を使用) では、対応する注文に品目が 1 つしかありません。その品目はストアド プロシージャによって削除されるため、残りの品目を返すクエリが実行されるときには結果セットが空になっています。結果が含まれている結果セットの各行は、関数 (ProcessRow) を使用して処理されます。結果セットが空の場合は、"The result set is empty" というメッセージが出力されます。

この例では、SQL Server と AdventureWorks データベースがローカル コンピューターにインストールされていることを前提としています。この例をコマンド ラインから実行した場合、すべての出力はコンソールに書き込まれます。

<?php
/* Connect to the local server using Windows Authentication and 
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
     echo "Could not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Drop the stored procedure if it already exists. */
$tsql_dropSP = "IF OBJECT_ID('UpdateInventory', 'P') IS NOT NULL 
                DROP PROCEDURE UpdateInventory";
$stmt1 = sqlsrv_query( $conn, $tsql_dropSP);
if( $stmt1 === false )
{
     echo "Error in executing statement 1.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Create the stored procedure. */
$tsql_createSP = "CREATE PROCEDURE UpdateInventory
                       @SalesOrderDetailID int
                  AS
                       BEGIN
                        --Get the SalesOrderID, ProductID, and Quantity
                        DECLARE @SalesOrderID int;
                        DECLARE @ProductID int;
                        DECLARE @OrderQty int;
                        SELECT @SalesOrderID = SalesOrderID,
                                   @ProductID = ProductID,
                                   @OrderQty = OrderQty
                        FROM Sales.SalesOrderDetail
                        WHERE SalesOrderDetailID = @SalesOrderDetailID;

                        --Update Inventory
                        UPDATE Production.ProductInventory 
                        SET Quantity = Quantity + @OrderQty 
                        WHERE ProductID = @ProductID;

                        --Delete the OrderDetail
                        DELETE FROM Sales.SalesOrderDetail
                        WHERE SalesOrderDetailID = @SalesOrderDetailID;

                        --Get remaining products for SalesOrderID
                        SELECT SalesOrderID,
                        SalesOrderDetailID,
                        ProductID,
                        OrderQty
                        FROM Sales.SalesOrderDetail
                        WHERE SalesOrderID = @SalesOrderID;
                    END";
$stmt2 = sqlsrv_query( $conn, $tsql_createSP);
if( $stmt2 === false)
{
     echo "Error in executing statement 2.\n";
     die( print_r( sqlsrv_errors(), true));
}
/*-------- The next few steps call the stored procedure. --------*/

/* Define the Transact-SQL query. Use question marks (?) in place of 
the parameters to be passed to the stored procedure */
$tsql_callSP = "{call UpdateInventory(?)}";

/* Define an array of parameter arrays. */
$param_arrays = array( 
                      array(16434),
                      array(121293)
                     );

/* Execute the query for each parameter array. */
foreach($param_arrays as $params)
{
     $stmt = sqlsrv_query( $conn, $tsql_callSP, $params);
     if( $stmt === false)
     {
          echo "Error in executing statement.\n";
          die( print_r( sqlsrv_errors(), true));
     }
     /* The first SELECT statement in the stored procedure only sets 
          the parameter values. It does not return a result set.*/
     /* Display the rows affected by the UPDATE statement in the stored 
        procedure and move to the next result. */
     echo "Rows updated: ".sqlsrv_rows_affected( $stmt )."\n";
     sqlsrv_next_result($stmt);

     /* Display the rows affected by the DELETE statement in the stored 
        procedure and move to the next result. */
     echo "Rows deleted: ".sqlsrv_rows_affected( $stmt )."\n";
     sqlsrv_next_result( $stmt );

     /* Determine if there are results returned by the SELECT statement
        of the stored procedure.  If there are results, display them.
        If there are no results, display an appropriate message. */
     $row = sqlsrv_fetch( $stmt );
     if( $row )
     {
          do
          {
               ProcessRow( $stmt );
               $row = sqlsrv_fetch( $stmt );
          }while( $row );
     }
     elseif( is_null( $row ))
     {
          echo "The result set is empty.\n";
     }
     elseif( $row === false )
     {
        die( print_r( sqlsrv_errors(), true));
     }
     echo "-------------------\n";
}

/* Free statement and connection resources. */
sqlsrv_free_stmt( $stmt1 );
sqlsrv_free_stmt( $stmt2 );
sqlsrv_free_stmt( $stmt );
sqlsrv_close( $conn );

function ProcessRow( $stmt )
{
     echo "SalesOrderID: ".sqlsrv_get_field($stmt, 0)."\n";
     echo "SalesOrderDetailID: ".sqlsrv_get_field($stmt, 1)."\n";
     echo "ProductID: ".sqlsrv_get_field($stmt, 2)."\n";
     echo "OrderQty: ".sqlsrv_get_field($stmt, 3)."\n\n";
}
?>

この例では、結果が空かどうかの確認に重点を置くために、一部の関数のエラー チェックが省略されています。エラーの処理については、「エラーおよび警告の処理」を参照してください。

参照

概念

データ取得関数の比較
ドキュメントのコード例について

その他のリソース

データの取得
データの更新 (SQL Server Driver for PHP)
API リファレンス (SQL Server Driver for PHP)