Dela via


Körning av direkta uttalanden och beredda uttalanden i drivrutinen för PDO_SQLSRV

Ladda ned PHP-drivrutin

I det här avsnittet beskrivs användningen av attributet PDO::SQLSRV_ATTR_DIRECT_QUERY för att ange direktkörning av uttryck istället för standardvärdet, som är förberedd körning av uttryck. Om du använder en förberedd instruktion kan det resultera i bättre prestanda om -instruktionen körs mer än en gång med hjälp av parameterbindning.

Anmärkningar

Om du vill skicka en Transact-SQL-instruktion direkt till servern utan förberedelse av instruktionen av drivrutinen kan du ange attributet PDO::SQLSRV_ATTR_DIRECT_QUERY med PDO::setAttribute (eller som ett drivrutinsalternativ som skickas till PDO::__construct) eller när du anropar PDO::p repare. Som standard är värdet för PDO::SQLSRV_ATTR_DIRECT_QUERY Falskt (använd förberedd instruktionskörning).

Om du använder PDO::query kanske du vill ha direkt körning. Innan du anropar PDO::query anropar du PDO::setAttribute och anger PDO::SQLSRV_ATTR_DIRECT_QUERY till Sant. Varje anrop till PDO::query kan köras med en annan inställning för PDO::SQLSRV_ATTR_DIRECT_QUERY.

Om du använder PDO::prepare och PDOStatement::execute för att köra en fråga flera gånger med hjälp av bundna parametrar, optimerar körningen av förberedda instruktioner körningen av den upprepade frågan. I det här fallet anropar du PDO::prepare med PDO::SQLSRV_ATTR_DIRECT_QUERY inställd på False i drivrutinsalternativens matrisparameter. Vid behov kan du köra förberedda instruktioner med PDO::SQLSRV_ATTR_DIRECT_QUERY inställt på False.

När du anropar PDO::prepare kan inte värdet för PDO::SQLSRV_ATTR_DIRECT_QUERY ändras när du genomför den förberedda frågan.

Om en fråga kräver det sammanhang som angavs i en tidigare fråga, kör dina frågor med PDO::SQLSRV_ATTR_DIRECT_QUERY inställd på true. Om du till exempel använder tillfälliga tabeller i dina frågor måste PDO::SQLSRV_ATTR_DIRECT_QUERY anges till Sant.

Följande exempel visar att när kontext från en tidigare instruktion krävs måste du ange PDO::SQLSRV_ATTR_DIRECT_QUERY till True. Det här exemplet använder tillfälliga tabeller, som endast är tillgängliga för efterföljande instruktioner i programmet när frågor körs direkt.

Anmärkning

Om frågan ska anropa en lagrad procedur och temporära tabeller används i den här lagrade proceduren använder du PDO::exec i stället.

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

Se även

Programmeringsguide för Microsoft-drivrutiner för PHP för SQL Server