Udostępnij przez


Wykonywanie instrukcji bezpośredniej i wykonywanie przygotowanej instrukcji w sterowniku PDO_SQLSRV

Pobieranie sterownika PHP

W tym temacie omówiono użycie atrybutu PDO::SQLSRV_ATTR_DIRECT_QUERY w celu określenia bezpośredniego wykonywania instrukcji zamiast domyślnego wykonywania instrukcji przygotowanych. Użycie przygotowanej instrukcji może spowodować lepszą wydajność, jeśli instrukcja jest wykonywana więcej niż raz przy użyciu powiązania parametrów.

Uwagi

Jeśli chcesz wysłać instrukcję Transact-SQL bezpośrednio do serwera bez przygotowania przez sterownik, możesz ustawić atrybut PDO::SQLSRV_ATTR_DIRECT_QUERY poprzez PDO::setAttribute (lub jako opcja sterownika przekazana do PDO::__construct) lub podczas wywoływania PDO::prepare. Domyślnie wartość PDO::SQLSRV_ATTR_DIRECT_QUERY jest ustawiona na False (użyj wykonywania przygotowanego zapytania).

Jeśli używasz PDO::query, możesz chcieć bezpośrednio wykonać zapytanie. Przed wywołaniem pdO::query wywołaj funkcję PDO::setAttribute i ustaw wartość PDO::SQLSRV_ATTR_DIRECT_QUERY na True. Każde wywołanie funkcji PDO::query można wykonać przy użyciu innego ustawienia dla pdO::SQLSRV_ATTR_DIRECT_QUERY.

Jeśli używasz PDO::prepare i PDOStatement::execute, aby wykonać zapytanie wielokrotnie z użyciem powiązanych parametrów, wykonanie przygotowanego zapytania optymalizuje przetwarzanie powtarzających się zapytań. W takiej sytuacji wywołaj PDO::prepare, ustawiając PDO::SQLSRV_ATTR_DIRECT_QUERY na False w tablicy opcji sterownika. W razie potrzeby można wykonać przygotowane instrukcje z wartością PDO::SQLSRV_ATTR_DIRECT_QUERY ustawioną na wartość False.

Po wywołaniu PDO::prepare wartość PDO::SQLSRV_ATTR_DIRECT_QUERY nie może ulec zmianie podczas wykonywania przygotowanego zapytania.

Jeśli zapytanie wymaga kontekstu ustawionego w poprzednim zapytaniu, wykonaj zapytania z wartością PDO::SQLSRV_ATTR_DIRECT_QUERY ustawioną na true. Jeśli na przykład używasz tabel tymczasowych w zapytaniach, wartość PDO::SQLSRV_ATTR_DIRECT_QUERY musi być ustawiona na true.

Poniższy przykład pokazuje, że gdy kontekst z poprzedniej instrukcji jest wymagany, należy ustawić wartość PDO::SQLSRV_ATTR_DIRECT_QUERY na true. W tym przykładzie są używane tabele tymczasowe, które są dostępne tylko dla kolejnych instrukcji w programie, gdy zapytania są wykonywane bezpośrednio.

Uwaga / Notatka

Jeśli zapytanie ma wywołać procedurę składowaną, a tabele tymczasowe są używane w tej procedurze składowanej, użyj zamiast tego 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");  
?>  

Zobacz też

Przewodnik programowania dla sterowników firmy Microsoft dla języka PHP dla programu SQL Server