Direct Statement Execution and Prepared Statement Execution in the PDO_SQLSRV Driver (PDO_SQLSRV ドライバーでの直接ステートメント実行と準備されたステートメントの実行)
このトピックでは、PDO::SQLSRV_ATTR_DIRECT_QUERY 属性を使用して、準備されたステートメントの実行である既定ではなく、直接のステートメントの実行を指定する方法について説明します。 パラメーターのバインドを使用してステートメントが複数回実行される場合、準備されたステートメントを使用すると、パフォーマンスが向上する可能性があります。
解説
ドライバーによるステートメントの準備を行わずに Transact-SQL ステートメントをサーバーに直接送信する場合は、PDO::SQLSRV_ATTR_DIRECT_QUERY 属性を PDO::setAttribute を使って (または PDO::__construct に渡されるドライバー オプションとして)、または PDO::prepare を呼び出すときに設定できます。 既定では、PDO::SQLSRV_ATTR_DIRECT_QUERY の値は False です (準備されたステートメントの実行を使用します)。
PDO::query を使用する場合は、直接実行が必要になることがあります。 PDO::query を呼び出す前に、PDO::setAttribute を呼び出し、PDO::SQLSRV_ATTR_DIRECT_QUERY を True に設定します。 PDO::query への各呼び出しは、PDO::SQLSRV_ATTR_DIRECT_QUERY の異なる設定で実行できます。
PDO::prepare と PDOStatement::execute を使用し、バインドされたパラメーターを使用してクエリを複数回実行すると、準備されたステートメントの実行によって、繰り返しクエリの実行が最適化されます。 この場合は、ドライバー オプション配列パラメーターで PDO::SQLSRV_ATTR_DIRECT_QUERY を False に設定して PDO::p repare を呼び出します。 必要に応じて、PDO::SQLSRV_ATTR_DIRECT_QUERY を False に設定して準備されたステートメントを実行できます。
PDO::p repare を呼び出した後、準備されたクエリの実行時に PDO::SQLSRV_ATTR_DIRECT_QUERY の値を変更することはできません。
あるクエリに、前のクエリで設定されたコンテキストが必要な場合は、PDO::SQLSRV_ATTR_DIRECT_QUERY を True に設定してクエリを実行します。 たとえば、クエリで一時テーブルを使用する場合、PDO::SQLSRV_ATTR_DIRECT_QUERY を True に設定する必要があります。
前のステートメントのコンテキストが必要な場合、PDO::SQLSRV_ATTR_DIRECT_QUERY を True に設定する必要があることを示す例を次に示します。 このサンプルは、クエリが直接実行されたときに、プログラム内の後続のステートメントでのみ使用できる一時テーブルを使用します。
Note
ストアド プロシージャを呼び出すためのクエリであり、このストアド プロシージャで一時テーブルが使用される場合は、代わりに PDO::exec を使用します。
<?php
$conn = new PDO('sqlsrv:Server=(local)', '', '');
$conn->setAttribute(constant('PDO::SQLSRV_ATTR_DIRECT_QUERY'), true);
$stmt1 = $conn->query("DROP TABLE #php_test_table");
$stmt2 = $conn->query("CREATE TABLE #php_test_table ([c1_int] int, [c2_int] int)");
$v1 = 1;
$v2 = 2;
$stmt3 = $conn->prepare("INSERT INTO #php_test_table (c1_int, c2_int) VALUES (:var1, :var2)");
if ($stmt3) {
$stmt3->bindValue(1, $v1);
$stmt3->bindValue(2, $v2);
if ($stmt3->execute())
echo "Execution succeeded\n";
else
echo "Execution failed\n";
}
else
var_dump($conn->errorInfo());
$stmt4 = $conn->query("DROP TABLE #php_test_table");
?>