Execução de instrução direta e execução de instrução preparada no driver PDO_SQLSRV

Baixar o driver PHP

Este tópico discute o uso do atributo PDO::SQLSRV_ATTR_DIRECT_QUERY para especificar a execução de instrução direta em vez do padrã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 de uma vez usando a associação de parâmetros.

Comentários

Se você quiser enviar uma instrução Transact-SQL diretamente para o servidor sem a preparação da instrução pelo driver, poderá definir o atributo PDO::SQLSRV_ATTR_DIRECT_QUERY com PDO::setAttribute (ou como uma opção de driver passada para PDO::__construct) ou quando você chamar PDO::prepare. Por padrão, o valor de PDO::SQLSRV_ATTR_DIRECT_QUERY é false (use a execução de instrução preparada).

Se você usar PDO::query, talvez seja melhor que você use a execução direta. Antes de chamar PDO::query, chame PDO::setAttribute e defina PDO::SQLSRV_ATTR_DIRECT_QUERY como true. Cada chamada para PDO::query pode ser executada com uma configuração diferente para PDO::SQLSRV_ATTR_DIRECT_QUERY.

Se você usar PDO::prepare e PDOStatement::execute para executar uma consulta várias vezes usando parâmetros associados, a execução da instrução preparada otimizará a execução da consulta repetida. Nessa situação, chame PDO::prepare com PDO::SQLSRV_ATTR_DIRECT_QUERY definido como False no parâmetro de matriz de opções de driver. Quando necessário, você pode executar instruções preparadas com PDO::SQLSRV_ATTR_DIRECT_QUERY definido como False.

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

Se uma consulta exigir o contexto que foi definido em uma consulta anterior, execute suas consultas com PDO::SQLSRV_ATTR_DIRECT_QUERY definido como True. Por exemplo, se você usar tabelas temporárias em suas consultas, PDO::SQLSRV_ATTR_DIRECT_QUERY precisará ser definido como true.

O exemplo a seguir mostra que, quando o contexto de uma instrução anterior é necessário, você precisa definir PDO::SQLSRV_ATTR_DIRECT_QUERY como true. Este exemplo usa tabelas temporárias, que só estão disponíveis para instruções subsequentes em seu programa quando as consultas são executadas diretamente.

Observação

Se a consulta for para invocar um procedimento armazenado e tabelas temporárias forem usadas 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");  
?>  

Consulte Também

Guia de programação do Microsoft Drivers para PHP para SQL Server