Direct Statement Execution and Prepared Statement Execution in the PDO_SQLSRV Driver (Ejecución de la instrucción preparada o directa en el controlador PDO_SQLSRV)

Descargar controlador PHP

En este tema se describe el uso del atributo PDO::SQLSRV_ATTR_DIRECT_QUERY para especificar la ejecución de la instrucción directa en lugar de la acción predeterminada, que es la ejecución de la instrucción preparada. El uso de una instrucción preparada puede dar lugar a un mejor rendimiento si la instrucción se ejecuta más de una vez mediante el enlace de parámetros.

Observaciones

Si quiere enviar una instrucción Transact-SQL directamente al servidor sin preparación de instrucciones para el controlador, puede establecer el atributo PDO::SQLSRV_ATTR_DIRECT_QUERY con PDO::setAttribute (o como una opción del controlador pasada a PDO::__construct) o cuando se llama a PDO::prepare. De forma predeterminada, el valor de PDO::SQLSRV_ATTR_DIRECT_QUERY es False (se usa la ejecución de la instrucción preparada).

Si usa PDO::query, es posible que desee la ejecución directa. Antes de llamar a PDO::query, llame a PDO::setAttribute y establezca PDO::SQLSRV_ATTR_DIRECT_QUERY en True. Cada llamada a PDO::query puede ejecutarse con un valor diferente para PDO::SQLSRV_ATTR_DIRECT_QUERY.

Si usa PDO::prepare y PDOStatement::execute para ejecutar una consulta varias veces con parámetros enlazados, la ejecución de la instrucción preparada optimiza la ejecución de la consulta repetida. En esta situación, llame a PDO::prepare con PDO::SQLSRV_ATTR_DIRECT_QUERY establecido en False en el parámetro de matriz de opciones de controlador. Cuando sea necesario, puede ejecutar instrucciones preparadas con PDO::SQLSRV_ATTR_DIRECT_QUERY establecido en False.

Después de llamar a PDO::prepare, el valor de PDO::SQLSRV_ATTR_DIRECT_QUERY no puede cambiar al ejecutar la consulta preparada.

Si una consulta requiere el contexto que se estableció en una consulta anterior, ejecute las consultas con PDO::SQLSRV_ATTR_DIRECT_QUERY establecido en True. Por ejemplo, si usa tablas temporales en las consultas, PDO::SQLSRV_ATTR_DIRECT_QUERY debe establecerse en True.

En el ejemplo siguiente se muestra que cuando se requiere el contexto de una instrucción anterior, es necesario establecer PDO::SQLSRV_ATTR_DIRECT_QUERY en true. En este ejemplo se usan tablas temporales, que solo están disponibles para las siguientes instrucciones del programa cuando las consultas se ejecutan directamente.

Nota:

Si la consulta va a invocar un procedimiento almacenado y las tablas temporales se utilizan en este procedimiento almacenado, use PDO::exec en su lugar.

<?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 también

Guía de programación para los controladores de Microsoft para PHP para SQL Server