PDO_SQLSRV 驅動程式中的直接陳述式執行和已備妥的陳述式執行

下載 PHP 驅動程式

本主題討論如何使用 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::preparePDOStatement::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");  
?>  

另請參閱

Microsoft Drivers for PHP for SQL Server 的程式設計指南