Partilhar via


Execução Direta de Instruções e Execução de Instruções Preparadas no controlador PDO_SQLSRV

Descarregar o driver PHP

Este tópico discute a utilização do atributo PDO::SQLSRV_ATTR_DIRECT_QUERY para especificar a execução direta da instrução em vez da predefinição, que é a execução da instrução preparada. Usar uma instrução preparada pode resultar em melhor desempenho se a instrução for executada mais do que uma vez usando ligação de parâmetros.

Observações

Se quiser enviar uma instrução Transact-SQL diretamente para o servidor sem preparação de instruções pelo driver, pode definir o atributo PDO::SQLSRV_ATTR_DIRECT_QUERY com PDO::setAttribute (ou como opção de driver passada para PDO::__construct) ou quando chamar PDO::prepare. Por defeito, o valor de PDO::SQLSRV_ATTR_DIRECT_QUERY é falso (use a execução de declarações preparadas).

Se usares PDO::query, talvez queiras execução direta. Antes de chamar PDO::query, chame PDO::setAttribute e defina PDO::SQLSRV_ATTR_DIRECT_QUERY para True. Cada chamada para PDO::query pode ser executada com uma definição diferente para PDO::SQLSRV_ATTR_DIRECT_QUERY.

Se usar PDO::prepare e PDOStatement::execute para executar uma consulta várias vezes usando parâmetros vinculados, a execução da consulta preparada otimiza a execução da consulta repetida. Nesta situação, chame PDO::prepare com PDO::SQLSRV_ATTR_DIRECT_QUERY definido para False no parâmetro do array de opções do controlador. Quando necessário, pode executar instruções preparadas com PDO::SQLSRV_ATTR_DIRECT_QUERY definido para Falso.

Depois de chamar PDO::prepare, o valor de PDO::SQLSRV_ATTR_DIRECT_QUERY não pode mudar ao executar a consulta preparada.

Se uma consulta requer o contexto definido numa consulta anterior, então execute as suas consultas com PDO::SQLSRV_ATTR_DIRECT_QUERY definido como True. Por exemplo, se usar tabelas temporárias nas suas consultas, o PDO::SQLSRV_ATTR_DIRECT_QUERY deve ser definido como Verdadeiro.

O exemplo seguinte mostra que, quando é necessário contexto de uma instrução anterior, é necessário definir PDO::SQLSRV_ATTR_DIRECT_QUERY para True. Este exemplo utiliza tabelas temporárias, que só estão disponíveis para instruções subsequentes no seu programa quando as consultas são executadas diretamente.

Observação

Se a consulta for invocar um procedimento armazenado e forem usadas tabelas temporárias neste procedimento armazenado, use PDO::exec em vez disso.

<?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");  
?>  

Ver também

Guia de Programação para os Microsoft Drivers for PHP para SQL Server