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.
Der OLE DB-Anbieter von SQL Server Native Client unterstützt die Befehlsvorbereitung für eine optimierte Mehrfachausführung eines einzelnen Befehls; Die Befehlsvorbereitung generiert jedoch Mehraufwand, und ein Consumer muss einen Befehl nicht mehr als einmal für die Ausführung vorbereiten. Im Allgemeinen sollte ein Befehl vorbereitet werden, wenn er mehr als dreimal ausgeführt wird.
Aus Leistungsgründen wird die Befehlsvorbereitung zurückgestellt, bis der Befehl ausgeführt wird. Dies ist das Standardverhalten. Alle Fehler im vorbereiteten Befehl werden erst bekannt, wenn der Befehl ausgeführt wird oder ein Metaproperty-Vorgang ausgeführt wird. Das Festlegen der SQL Server-Eigenschaft SSPROP_DEFERPREPARE auf FALSE kann dieses Standardverhalten deaktivieren.
Wenn ein Befehl in SQL Server direkt ausgeführt wird (ohne ihn zuerst vorzubereiten), wird ein Ausführungsplan erstellt und zwischengespeichert. Wenn die SQL-Anweisung erneut ausgeführt wird, verfügt SQL Server über einen effizienten Algorithmus, um mit der neuen Anweisung mit dem vorhandenen Ausführungsplan im Cache übereinzugleichen und den Ausführungsplan für diese Anweisung wiederzuverwenden.
Für vorbereitete Befehle bietet SQL Server systemeigene Unterstützung für die Vorbereitung und Ausführung von Befehlsanweisungen. Wenn Sie eine Anweisung vorbereiten, erstellt SQL Server einen Ausführungsplan, speichert ihn zwischen und gibt einen Handle an diesen Ausführungsplan an den Anbieter zurück. Der Anbieter verwendet dann dieses Handle, um die Anweisung wiederholt auszuführen. Es werden keine gespeicherten Prozeduren erstellt. Da das Handle den Ausführungsplan für eine SQL-Anweisung direkt identifiziert, anstatt die Anweisung dem Ausführungsplan im Cache zuzuordnen (wie bei der direkten Ausführung), ist es effizienter, eine Anweisung vorzubereiten, als sie direkt auszuführen, wenn Sie wissen, dass die Anweisung mehrmals ausgeführt wird.
In SQL Server 2005 können die vorbereiteten Anweisungen nicht zum Erstellen temporärer Objekte verwendet werden und können nicht auf gespeicherte Systemprozeduren verweisen, die temporäre Objekte erstellen, z. B. temporäre Tabellen. Diese Prozeduren müssen direkt ausgeführt werden.
Einige Befehle sollten niemals vorbereitet werden. Beispielsweise sollten Befehle, die die Ausführung der gespeicherten Prozedur angeben oder ungültigen Text für die Erstellung gespeicherter SQL Server-Prozeduren enthalten, nicht vorbereitet werden.
Wenn eine temporäre gespeicherte Prozedur erstellt wird, führt der OLE DB-Anbieter des SQL Server Native Client die temporäre gespeicherte Prozedur aus und gibt Ergebnisse zurück, als ob die Anweisung selbst ausgeführt wurde.
Die Erstellung temporärer gespeicherter Prozeduren wird vom OLE DB-Anbieter des SQL Server Native Client -specific Initialisierungseigenschaft SSPROP_INIT_USEPROCFORPREP gesteuert. Wenn der Eigenschaftswert entweder SSPROPVAL_USEPROCFORPREP_ON oder SSPROPVAL_USEPROCFORPREP_ON_DROP ist, versucht der OLE DB-Anbieter des SQL Server Native Client, eine gespeicherte Prozedur zu erstellen, wenn ein Befehl vorbereitet wird. Die Erstellung gespeicherter Prozeduren ist erfolgreich, wenn der Anwendungsbenutzer über ausreichende SQL Server-Berechtigungen verfügt.
Für Verbraucher, die selten getrennt werden, kann die Erstellung temporärer gespeicherter Prozeduren erhebliche Ressourcen von tempdb erfordern, die SQL Server-Systemdatenbank, in der temporäre Objekte erstellt werden. Wenn der Wert von SSPROP_INIT_USEPROCFORPREP on SSPROPVAL_USEPROCFORPREP_ ist, werden temporäre gespeicherte Prozeduren, die vom SQL Server Native Client OLE DB-Anbieter erstellt wurden, nur gelöscht, wenn die Sitzung, die den Befehl erstellt hat, die Verbindung mit der Instanz von SQL Server verliert. Wenn diese Verbindung die Standardverbindung ist, die für die Datenquelleninitialisierung erstellt wurde, wird die temporäre gespeicherte Prozedur nur gelöscht, wenn die Datenquelle nicht initialisiert wird.
Wenn der Wert von SSPROP_INIT_USEPROCFORPREP SSPROPVAL_USEPROCFORPREP_ON_DROP ist, werden die temporären gespeicherten Prozeduren des SQL Server Native Client OLE DB-Anbieters gelöscht, wenn einer der folgenden Ereignisse auftritt:
Der Consumer verwendet ICommandText::SetCommandText , um einen neuen Befehl anzugeben.
Der Consumer verwendet ICommandPrepare::Unprepare , um anzugeben, dass er den Befehlstext nicht mehr benötigt.
Der Consumer gibt alle Verweise auf das Befehlsobjekt mithilfe der temporären gespeicherten Prozedur frei.
Ein Befehlsobjekt verfügt über höchstens eine temporäre gespeicherte Prozedur in tempdb. Jede vorhandene temporäre gespeicherte Prozedur stellt den aktuellen Befehlstext eines bestimmten Befehlsobjekts dar.