Sdílet prostřednictvím


Přímé spuštění příkazů a spuštění připraveného příkazu v ovladači PDO_SQLSRV

Stáhnout ovladač PHP

Toto téma popisuje použití atributu PDO::SQLSRV_ATTR_DIRECT_QUERY k určení přímého provádění příkazů místo výchozího režimu, kterým je spuštění připravených příkazů. Použití připraveného příkazu může vést k lepšímu výkonu, pokud se příkaz spustí více než jednou pomocí vazby parametru.

Poznámky

Pokud chcete odeslat příkaz Transact-SQL přímo na server bez přípravy příkazu ovladačem, můžete nastavit pdo::SQLSRV_ATTR_DIRECT_QUERY atribut pomocí pdO::setAttribute (nebo jako možnost ovladače předaného pdO::__construct) nebo při volání pdO::p repare. Ve výchozím nastavení je hodnota PDO::SQLSRV_ATTR_DIRECT_QUERY False (použijte připravené spuštění příkazu).

Pokud používáte PDO::query, můžete chtít přímé spuštění. Před voláním pdo::queryzavolejte PDO::setAttribute a nastavte PDO::SQLSRV_ATTR_DIRECT_QUERY na True. Každé volání pdo::query se dá spustit s jiným nastavením pro pdo::SQLSRV_ATTR_DIRECT_QUERY.

Pokud používáte PDO::prepare a PDOStatement::execute k provedení dotazu vícekrát pomocí parametrů s vazbou, spuštění připraveného příkazu optimalizuje provádění opakovaného příkazu. V této situaci volejte PDO::prepare s PDO::SQLSRV_ATTR_DIRECT_QUERY nastavený na hodnotu False v parametru pole s možnostmi ovladače. V případě potřeby můžete spouštět připravené příkazy s pdo::SQLSRV_ATTR_DIRECT_QUERY nastavenou na Hodnotu False.

Po volání PDO::prepare se hodnota PDO::SQLSRV_ATTR_DIRECT_QUERY nemůže změnit při provádění připraveného dotazu.

Pokud dotaz vyžaduje kontext nastavený v předchozím dotazu, spusťte své dotazy pomocí pdO::SQLSRV_ATTR_DIRECT_QUERY nastavenou na Hodnotu True. Pokud například v dotazech používáte dočasné tabulky, musí být PDO::SQLSRV_ATTR_DIRECT_QUERY nastaven na True.

Následující ukázka ukazuje, že pokud je požadován kontext z předchozího příkazu, musíte nastavit pdO::SQLSRV_ATTR_DIRECT_QUERY na Hodnotu True. Tato ukázka používá dočasné tabulky, které jsou k dispozici pouze pro následné příkazy v programu při přímém spuštění dotazů.

Poznámka:

Pokud dotaz vyvolá uloženou proceduru a dočasné tabulky se použijí v této uložené proceduře, použijte místo toho 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");  
?>  

Viz také

Průvodce programováním pro ovladače Microsoftu pro PHP pro SQL Server