PDO_SQLSRV 驅動程式中的直接陳述式執行和已備妥的陳述式執行
本主題討論如何使用 PDO::SQLSRV_ATTR_DIRECT_QUERY 屬性來指定直接陳述式執行,而不是預設值 ─ 已備妥的陳述式執行。 如果使用參數繫結多次執行陳述式,使用備妥的陳述式可能會產生較佳的效能。
備註
若要將 Transact-SQL 陳述式直接傳送至伺服器,但不含驅動程式備妥的陳述式,您可以使用 PDO::setAttribute (或是傳遞至 PDO::__construct 的驅動程式選項),或在呼叫 PDO::prepare 時,設定 PDO::SQLSRV_ATTR_DIRECT_QUERY 屬性。 根據預設,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::prepare。 必要時,您可以在 PDO::SQLSRV_ATTR_DIRECT_QUERY 設定為 False 的情況下執行備妥的陳述式。
在您呼叫 PDO::prepare 之後,在執行備妥的查詢時,PDO::SQLSRV_ATTR_DIRECT_QUERY 的值就不能變更。
如果查詢需要先前查詢中所設定的內容,請在 PDO::SQLSRV_ATTR_DIRECT_QUERY 設定為 True 的情況下來執行查詢。 例如,如果您在查詢中使用暫存資料表,則 PDO::SQLSRV_ATTR_DIRECT_QUERY 必須設定為 True。
下列範例顯示當需要上一個陳述式的上下文時,您必須將 PDO::SQLSRV_ATTR_DIRECT_QUERY 設定為 True。 這個範例使用暫存資料表,這些暫存資料表僅在直接執行查詢時才可用於程式中的後續陳述式。
注意
如果查詢是用來叫用預存程序,而且此預存程序中使用暫存資料表,請改為使用 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");
?>