Поделиться через


Выполнение прямых и подготовленных инструкций в драйвере PDO_SQLSRV

Скачать драйвер PHP

В этой статье описывается использование атрибута 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:: PDO::SQLSRV_ATTR_DIRECT_QUERY значение true. Каждый вызов PDO::query может быть выполнен с другим параметром для PDO::SQLSRV_ATTR_DIRECT_QUERY.

При использовании PDO::prepare и PDOStatement::execute для многократного выполнения запроса с использованием привязанных параметров выполнение подготовленной инструкции оптимизирует выполнение повторяющегося запроса. В этом случае вызовите параметр PDO::prepare с PDO::SQLSRV_ATTR_DIRECT_QUERY со значением false в параметре массива параметров драйвера. При необходимости можно выполнять подготовленные инструкции с параметром 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 для PHP для SQL Server