Direkte Anweisungsausführung und vorbereitete Anweisungsausführung im PDO_SQLSRV-Treiber.
In diesem Artikel wird erläutert, wie das PDO::SQLSRV_ATTR_DIRECT_QUERY-Attribut verwendet wird, um die direkte Anweisungsausführung anstelle des Standardwerts, der die Ausführung der vorbereiteten Anweisung darstellt, anzugeben. Die Verwendung einer vorbereiteten Anweisung kann zu einer besseren Leistung führen, wenn die Anweisung mithilfe einer Parameterbindung mehrmals ausgeführt wird.
Bemerkungen
Wenn Sie eine Transact-SQL-Anweisung ohne Vorbereitung durch den Treiber direkt an den Server senden möchten, können Sie das PDO::SQLSRV_ATTR_DIRECT_QUERY-Attribut mit PDO::setAttribute (oder als Treiberoption, die an PDO::__construct übergeben wird) oder beim Aufruf von PDO::prepare festlegen. Standardmäßig weist PDO::SQLSRV_ATTR_DIRECT_QUERY den Wert „false“ auf (Ausführung vorbereiteter Anweisungen verwenden).
Wenn Sie PDO::query verwenden, ist möglicherweise eine direkte Ausführung wünschenswert. Bevor Sie PDO::query aufrufen, rufen Sie PDO::setAttribute auf, und legen Sie PDO::SQLSRV_ATTR_DIRECT_QUERY auf „true“ fest. Jeder Aufruf von PDO::query kann mit einer anderen Einstellung für PDO::SQLSRV_ATTR_DIRECT_QUERY ausgeführt werden.
Wenn Sie PDO::prepare und PDOStatement::execute verwenden, um eine Abfrage mithilfe von Bindungsparametern mehrmals auszuführen, optimieren vorbereitete Anweisungen die Ausführung der wiederholten Abfrage. Rufen Sie in diesem Fall PDO::prepare auf – hierbei muss PDO::SQLSRV_ATTR_DIRECT_QUERY im Parameter für das Treiberoptionsarray auf „false“ festgelegt sein. Wenn nötig, können Sie vorbereitete Anweisungen mit auf „false“ festgelegtem Attribut PDO::SQLSRV_ATTR_DIRECT_QUERY ausführen.
Nach dem Aufruf von PDO::prepare kann der Wert von PDO::SQLSRV_ATTR_DIRECT_QUERY beim Ausführen der vorbereiteten Abfrage nicht geändert werden.
Wenn eine Abfrage den in einer vorherigen Abfrage festgelegten Kontext benötigt, führen Sie Ihre Abfragen mit auf „true“ festgelegtem Attribut PDO::SQLSRV_ATTR_DIRECT_QUERY aus. Wenn Sie beispielsweise temporäre Tabellen in Ihren Abfragen verwenden, muss PDO::SQLSRV_ATTR_DIRECT_QUERY auf „true“ festgelegt sein.
Das folgende Beispiel zeigt, dass PDO::SQLSRV_ATTR_DIRECT_QUERY auf „true“ festgelegt werden muss, wenn Kontext aus einer vorherigen Abfrage erforderlich ist. Dieses Beispiel verwendet temporäre Tabellen, die für nachfolgende Anweisungen in Ihrem Programm nur verfügbar sind, wenn Abfragen direkt ausgeführt werden.
Hinweis
Wenn die Abfrage darin besteht, eine gespeicherte Prozedur aufrufen, und in dieser gespeicherten Prozedur temporäre Tabellen verwendet werden, verwenden Sie stattdessen 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");
?>
Weitere Informationen
Programmierhandbuch für die Microsoft-Treiber für PHP für SQL Server