Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die ODBC-API definiert die vorbereitete Ausführung als Möglichkeit, um den Analyse- und Kompilierungsaufwand zu reduzieren, der wiederholt mit der Ausführung einer Transact-SQL-Anweisung verknüpft ist. Die Anwendung erstellt eine Zeichenfolge mit einer SQL-Anweisung und führt sie dann in zwei Phasen aus. Sie ruft die SQLPrepare-Funktion einmal auf, damit die Anweisung analysiert und in einen Ausführungsplan vom Datenbankmodul kompiliert wird. Anschließend wird SQLExecute für jede Ausführung des vorbereiteten Ausführungsplans aufgerufen. Dadurch wird der Analyse- und Kompilierungsaufwand für jede Ausführung gespeichert. Die vorbereitete Ausführung wird häufig von Anwendungen verwendet, um wiederholt dieselbe parametrisierte SQL-Anweisung auszuführen.
Bei den meisten Datenbanken ist die vorbereitete Ausführung schneller als die direkte Ausführung für Anweisungen, die mehr als drei oder vier Mal ausgeführt werden, hauptsächlich weil die Anweisung nur einmal kompiliert wird, während Anweisungen, die direkt ausgeführt werden, bei jeder Ausführung kompiliert werden. Die vorbereitete Ausführung kann auch eine Verringerung des Netzwerkdatenverkehrs ermöglichen, da der Treiber bei jeder Ausführung der Anweisung einen Ausführungsplanbezeichner und die Parameterwerte anstelle einer gesamten SQL-Anweisung an die Datenquelle senden kann.
SQL Server reduziert den Leistungsunterschied zwischen direkter und vorbereiteter Ausführung durch verbesserte Algorithmen zum Erkennen und Erneutes Verwenden von Ausführungsplänen aus SQLExecDirect. Dies macht einige der Leistungsvorteile der vorbereiteten Ausführung für Anweisungen verfügbar, die direkt ausgeführt werden. Weitere Informationen finden Sie unter Direct Execution.
SQL Server bietet auch native Unterstützung für die vorbereitete Ausführung. Ein Ausführungsplan basiert auf SQLPrepare und wird später ausgeführt, wenn SQLExecute aufgerufen wird. Da SQL Server zum Erstellen temporärer gespeicherter Prozeduren für SQLPrepare nicht erforderlich ist, gibt es keinen zusätzlichen Aufwand für die Systemtabellen in tempdb.
Aus Leistungsgründen wird die Anweisungsvorbereitung verzögert, bis SQLExecute aufgerufen wird oder ein Metaproperty-Vorgang (z. B. SQLDescribeCol oder SQLDescribeParam in ODBC) ausgeführt wird. Dies ist das Standardverhalten. Alle Fehler in der vorbereiteten Anweisung werden erst bekannt, wenn die Anweisung ausgeführt wird oder ein Metaproperty-Vorgang ausgeführt wird. Durch Festlegen des SQL Server Native Client ODBC-Treiberspezifischen Anweisungsattributs SQL_SOPT_SS_DEFER_PREPARE auf SQL_DP_OFF kann dieses Standardverhalten deaktiviert werden.
Bei verzögerter Vorbereitung generiert das Aufrufen von SQLDescribeCol oder SQLDescribeParam vor dem Aufrufen von SQLExecute einen zusätzlichen Roundtrip zum Server. Bei SQLDescribeCol entfernt der Treiber die WHERE-Klausel aus der Abfrage und sendet sie an den Server mit SET FMTONLY ON, um die Beschreibung der Spalten im ersten Von der Abfrage zurückgegebenen Resultset abzurufen. In SQLDescribeParam ruft der Treiber den Server auf, um eine Beschreibung der Ausdrücke oder Spalten abzurufen, auf die von parametermarkierungen in der Abfrage verwiesen wird. Diese Methode hat auch einige Einschränkungen, z. B. dass Parameter in Unterabfragen nicht aufgelöst werden können.
Übermäßige Verwendung von SQLPrepare mit dem SQL Server Native Client ODBC-Treiber beeinträchtigt die Leistung, insbesondere wenn sie mit früheren Versionen von SQL Server verbunden ist. Die vorbereitete Ausführung sollte nicht für Anweisungen verwendet werden, die ein einziges Mal ausgeführt werden. Die vorbereitete Ausführung ist langsamer als die direkte Ausführung für eine einzelne Ausführung einer Anweisung, da ein zusätzlicher Netzwerk-Roundtrip vom Client zum Server erforderlich ist. In früheren Versionen von SQL Server generiert sie auch eine temporäre gespeicherte Prozedur.
Vorbereitete Anweisungen können nicht zum Erstellen temporärer Objekte auf SQL Server verwendet werden.
Einige frühe ODBC-Anwendungen verwendeten SQLPrepare jedes Mal , wenn SQLBindParameter verwendet wurde. SQLBindParameter erfordert nicht die Verwendung von SQLPrepare, sie kann mit SQLExecDirect verwendet werden. Verwenden Sie beispielsweise SQLExecDirect mit SQLBindParameter , um den Rückgabecode oder ausgabeparameter aus einer gespeicherten Prozedur abzurufen, die nur einmal ausgeführt wird. Verwenden Sie SQLPrepare nicht mit SQLBindParameter , es sei denn, dieselbe Anweisung wird mehrmals ausgeführt.