Esecuzione di istruzioni diretta e preparata nel driver PDO_SQLSRV
Questo argomento illustra come usare l'attributo PDO::SQLSRV_ATTR_DIRECT_QUERY per specificare l'esecuzione diretta delle istruzioni anziché l'impostazione predefinita, che corrisponde all'esecuzione di istruzioni preparate. L'uso di un'istruzione preparata può determinare prestazioni migliori se l'istruzione viene eseguita più volte tramite l'associazione di parametri.
Osservazioni:
Se si vuole inviare un'istruzione Transact-SQL direttamente al server senza la preparazione dell'istruzione da parte del driver, è possibile impostare l'attributo PDO::SQLSRV_ATTR_DIRECT_QUERY con PDO::setAttribute (o come opzione del driver passata a PDO::__construct) o quando si chiama PDO::prepare. Per impostazione predefinita, il valore di DOP::SQLSRV_ATTR_DIRECT_QUERY è False (usare l'esecuzione dell'istruzione preparata).
Se si usa DOP::query, potrebbe essere necessaria l'esecuzione diretta. Prima di chiamare DOP::query, chiamare DOP::SetAttribute e impostare DOP::SQLSRV_ATTR_DIRECT_QUERY su True. Ogni chiamata a PDO::query può essere eseguita con un'impostazione diversa per PDO::SQLSRV_ATTR_DIRECT_QUERY.
Se si usa PDO::prepare e PDOStatement::execute per eseguire una query più volte tramite parametri associati, l'esecuzione dell'istruzione preparata ottimizza l'esecuzione della query ripetuta. In questa situazione, chiamare PDO::prepare con PDO::SQLSRV_ATTR_DIRECT_QUERY impostato su False nel parametro di matrice delle opzioni del driver. Se necessario, è possibile eseguire le istruzioni preparate con PDO::SQLSRV_ATTR_DIRECT_QUERY impostato su False.
Dopo aver chiamato PDO::prepare, il valore di PDO::SQLSRV_ATTR_DIRECT_QUERY non può essere modificato quando si esegue la query preparata.
Se una query richiede il contesto impostato in una query precedente, eseguire le query con PDO::SQLSRV_ATTR_DIRECT_QUERY impostato su True. Se ad esempio si usano tabelle temporanee nelle query, PDO::SQLSRV_ATTR_DIRECT_QUERY deve essere impostato su True.
L'esempio seguente illustra che, quando viene richiesto contesto da un'istruzione precedente, è necessario impostare PDO::SQLSRV_ATTR_DIRECT_QUERY su True. In questo esempio vengono usate le tabelle temporanee, che sono disponibili solo per le istruzioni successive nel programma quando le query vengono eseguite direttamente.
Nota
Se la query consiste nel richiamare una stored procedure in cui vengono usate tabelle temporanee, usare invece 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");
?>
Vedi anche
Guida alla programmazione per i driver Microsoft per PHP per SQL Server