Freigeben über


Vorgehensweise: Mehrmaliges Ausführen einer Abfrage

Im Beispiel in diesem Thema wird veranschaulicht, wie der SQL Server-Treiber für PHP zum mehrmaligen Ausführen einer vorbereiteten Anweisung verwendet werden kann. Durch die Kombination von sqlsrv_prepare und sqlsrv_execute kann eine Anweisung einmal auf dem Server kompiliert und mehrmals mit unterschiedlichen Parameterwerten ausgeführt werden.

Hinweis

Für einmal auszuführende Abfragen wird die Verwendung von sqlsrv_query empfohlen.

Wenn Sie eine Anweisung vorbereiten, in der mehrere Variablen als Parameter verwendet werden, dann sind die Variablen an die Anweisung gebunden. Das heißt, wenn Sie die Variablenwerte aktualisieren, werden bei der nächsten Ausführung der Anweisung die aktualisierten Parameterwerte verwendet.

Beispiel

Im folgenden Beispiel wird gezeigt, wie Sie eine Anweisung vorbereiten und sie dann mit verschiedenen Parameterwerten ausführen. In diesem Beispiel wird die OrderQty-Spalte der Sales.SalesOrderDetail-Tabelle der AdventureWorks-Datenbank aktualisiert. Nach den Aktualisierungen wird die Datenbank abgefragt, um zu überprüfen, ob die Aktualisierungen erfolgreich durchgeführt wurden. Im Beispiel wird davon ausgegangen, dass SQL Server und die AdventureWorks-Datenbank auf dem lokalen Computer installiert sind. Alle Ausgaben werden in die Konsole geschrieben, wenn das Beispiel über die Befehlszeile ausgeführt wird.

<?php
/* Connect to the local server using Windows Authentication and
specify the AdventureWorks database as the database in use. */
$serverName = "(local)";
$connectionInfo = array( "Database"=>"AdventureWorks");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn === false )
{
     echo "Could not connect.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Define the parameterized query. */
$tsql = "UPDATE Sales.SalesOrderDetail
         SET OrderQty = ?
         WHERE SalesOrderDetailID = ?";

/* Initialize parameters and prepare the statement. Variables $qty
and $id are bound to the statement, $stmt1. */
$qty = 0; $id = 0;
$stmt1 = sqlsrv_prepare( $conn, $tsql, array( &$qty, &$id));
if( $stmt1 )
{
     echo "Statement 1 prepared.\n";
} 
else 
{
     echo "Error in statement preparation.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Set up the SalesOrderDetailID and OrderQty information. This array
maps the order ID to order quantity in key=>value pairs. */
$orders = array( 1=>10, 2=>20, 3=>30);

/* Execute the statement for each order. */
foreach( $orders as $id => $qty)
{
     // Because $id and $qty are bound to $stmt1, their updated
     // values are used with each execution of the statement. 
     if( sqlsrv_execute( $stmt1) === false )
     {
          echo "Error in statement execution.\n";
          die( print_r( sqlsrv_errors(), true));
     }
}
echo "Orders updated.\n";

/* Free $stmt1 resources.  This allows $id and $qty to be bound to a different statement.*/
sqlsrv_free_stmt( $stmt1);

/* Now verify that the results were successfully written by selecting 
the newly inserted rows. */
$tsql = "SELECT OrderQty 
         FROM Sales.SalesOrderDetail 
         WHERE SalesOrderDetailID = ?";

/* Prepare the statement. Variable $id is bound to $stmt2. */
$stmt2 = sqlsrv_prepare( $conn, $tsql, array( &$id));
if( $stmt2 )
{
     echo "Statement 2 prepared.\n";
} 
else 
{
     echo "Error in statement preparation.\n";
     die( print_r( sqlsrv_errors(), true));
}

/* Execute the statement for each order. */
foreach( array_keys($orders) as $id)
{
     /* Because $id is bound to $stmt2, its updated value 
        is used with each execution of the statement. */
     if( sqlsrv_execute( $stmt2))
     {
          sqlsrv_fetch( $stmt2);
          $quantity = sqlsrv_get_field( $stmt2, 0);
          echo "Order $id is for $quantity units.\n";
     }
     else
     {
          echo "Error in statement execution.\n";
          die( print_r( sqlsrv_errors(), true));
     }
}

/* Free $stmt2 and connection resources. */
sqlsrv_free_stmt( $stmt2);
sqlsrv_close( $conn);
?>

Alternative Strategien zum Schreiben und Lesen großer Mengen von Informationen finden Sie unter Batches of SQL Statements und BULK INSERT (in englischer Sprache).

Siehe auch

Aufgaben

Vorgehensweise: Durchführen parametrisierter Abfragen
Vorgehensweise: Arbeiten mit mehreren Resultsets

Weitere Ressourcen

Entwurfsaspekte
Abrufen von Daten
Aktualisieren von Daten (SQL Server-Treiber für PHP)
API-Referenz (SQL Server-Treiber für PHP)