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.
Gilt für:SQL Server
Von Bedeutung
Dieses Feature wird in einer zukünftigen Version von SQL Server entfernt. Vermeiden Sie die Verwendung dieses Features in neuer Entwicklungsarbeit, und planen Sie, Anwendungen zu ändern, die derzeit dieses Feature verwenden. Nutze stattdessen die CLR-Integration .
Wie erweiterte gespeicherte Verfahren funktionieren
Der Prozess, durch den ein erweitertes gespeichertes Verfahren funktioniert, ist:
Wenn ein Client eine erweiterte gespeicherte Prozedur ausführt, wird die Anfrage im Tabular Data Stream (TDS) oder Simple Object Access Protocol (SOAP)-Format von der Client-Anwendung an SQL Server übertragen.
SQL Server sucht nach der mit der erweiterten gespeicherten Prozedur verbundenen DLL und lädt die DLL, falls sie noch nicht geladen ist.
SQL Server ruft das angeforderte erweiterte gespeicherte Verfahren auf (implementiert als Funktion innerhalb der DLL).
Die erweiterte gespeicherte Prozedur übergibt Ergebnissets und Rückgabe von Parametern über die Extended Stored Procedure API an den Server.
Früher wurde Open Data Services verwendet, um Serveranwendungen zu schreiben, wie zum Beispiel Gateways zu nicht-SQL Server-Datenbankumgebungen. SQL Server unterstützt die veralteten Teile der Open Data Services API nicht. Der einzige Teil der ursprünglichen Open Data Services API, der noch von SQL Server unterstützt wird, sind die erweiterten gespeicherten Prozedurfunktionen, weshalb die API in Extended Stored Procedure API umbenannt wurde.
Mit dem Aufkommen verteilter Abfragen und der CLR-Integration wurde der Bedarf an Extended Stored Procedure API-Anwendungen weitgehend ersetzt.
Wenn du bereits Gateway-Anwendungen hast, kannst du den opends60.dll mit SQL Server gelieferten Server nicht nutzen, um die Anwendungen auszuführen. Gateway-Anwendungen werden nicht mehr unterstützt.
Erweiterte gespeicherte Prozeduren vs. CLR-Integration
Die CLR-Integration bietet eine robustere Alternative zum Schreiben von serverseitiger Logik, die entweder schwer auszudrücken oder in Transact-SQL unmöglich zu schreiben war. In früheren Versionen von SQL Server stellten erweiterte gespeicherte Prozeduren (XPs) den einzigen Mechanismus bereit, den Datenbankanwendungsentwicklern zur Verfügung stand, um solchen Code zu schreiben.
Bei der CLR-Integration lässt sich Logik, die früher in Form gespeicherter Prozeduren geschrieben wurde, oft besser als tabellenwertige Funktionen ausdrücken, die es ermöglichen, die von der Funktion konstruierten Ergebnisse in SELECT Anweisungen abzufragen, indem sie sie in die FROM Klausel einbetten.
Weitere Informationen finden Sie unter CLR-Integrationsübersicht.
Ausführungsmerkmale erweiterter gespeicherter Prozeduren
Die Ausführung einer erweiterten gespeicherten Prozedur weist folgende Eigenschaften auf:
Die erweiterte Speicherprozedur-Funktion wird im Sicherheitskontext von SQL Server ausgeführt.
Die erweiterte Stored Procedure-Funktion läuft im Prozessraum von SQL Server.
Der Thread, der mit der Ausführung der erweiterten gespeicherten Prozedur verbunden ist, ist derselbe, der für die Client-Verbindung verwendet wird.
Von Bedeutung
Bevor erweiterte gespeicherte Prozeduren zum Server hinzugefügt und anderen Benutzern Ausführungsrechte gewährt werden, sollte der Systemadministrator jede erweiterte gespeicherte Prozedur gründlich überprüfen, um sicherzustellen, dass sie keinen schädlichen oder bösartigen Code enthält.
Nachdem die erweiterte gespeicherte Prozedur-DLL geladen wurde, bleibt die DLL im Adressraum des Servers geladen, bis SQL Server gestoppt wird oder der Administrator die DLL explizit durch die Verwendung DBCC <DLL_name> (FREE)entlastet.
Die erweiterte gespeicherte Prozedur kann aus Transact-SQL als gespeicherte Prozedur ausgeführt werden, indem die Anweisung verwendet wird EXECUTE :
EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT;
Die Parameter
@ Retval
Ein Renditewert.
@ param1
Ein Eingabeparameter.
@ param2
Ein Ein-/Ausgabeparameter.
Vorsicht
Erweiterte gespeicherte Prozeduren bieten Leistungsverbesserungen und erweitern die Funktionalität des SQL-Servers. Da jedoch die erweiterte gespeicherte Prozedur DLL und SQL Server denselben Adressraum teilen, kann ein Problemverfahren die Funktion von SQL Server negativ beeinflussen. Obwohl Ausnahmen durch die erweiterte gespeicherte Prozedur-DLL von SQL Server behandelt werden, ist es möglich, dass SQL Server-Datenbereiche beschädigt werden. Als Sicherheitsmaßnahme können nur SQL-Server-Systemadministratoren erweiterte gespeicherte Prozeduren zu SQL Server hinzufügen. Diese Verfahren sollten gründlich getestet werden, bevor sie installiert werden.
Senden Sie Ergebnissets mit der Extended Stored Procedure API an den Server
Beim Senden eines Ergebnissatzes an SQL Server sollte das erweiterte gespeicherte Verfahren die entsprechende API wie folgt aufrufen:
Die
srv_sendmsgFunktion kann in beliebiger Reihenfolge vor oder nach allen Zeilen (falls vorhanden) mitsrv_sendrowaufgerufen werden. Alle Nachrichten müssen an den Client gesendet werden, bevor der Abschlussstatus mitsrv_senddonegesendet wird.Die
srv_sendrowFunktion wird einmal für jede an den Client gesendete Zeile aufgerufen. Alle Zeilen müssen an den Client gesendet werden, bevor Nachrichten, Statuswerte oder Abschlussstatusse mitsrv_sendmsg, demsrv_statusArgument vonsrv_pfield, odersrv_senddonegesendet werden.Das Senden einer Zeile, in der nicht alle Spalten definiert sind
srv_describe, führt dazu, dass die Anwendung eine Informationsfehlermeldung auslöst und zum Client zurückkehrtFAIL. In diesem Fall wird die Reihe nicht gesendet.
Erstellen Sie erweiterte gespeicherte Prozeduren
Eine erweiterte gespeicherte Prozedur ist eine C/C++-Funktion mit einem Prototyp:
SRVRETCODE xp_extendedProcName (SRVPROC *);
Die Verwendung des Präfixes xp_ ist optional. Namen erweiterter gespeicherter Prozeduren sind groß- und schreibungssensitiv, wenn sie in Transact-SQL Anweisungen referenziert werden, unabhängig von der auf dem Server installierten Codepage oder Sortierreihenfolge. Wenn du eine DLL baust:
Wenn ein Einstiegspunkt notwendig ist, schreibe eine
DllMainFunktion.Diese Funktion ist optional. Wenn du es nicht im Quellcode bereitstellst, verlinkt der Compiler seine eigene Version, die nichts anderes tut, als . zurückzugeben
TRUE. Wenn Sie eineDllMainFunktion bereitstellen, ruft das Betriebssystem diese Funktion auf, wenn ein Thread oder Prozess an die DLL angeschlossen oder sich davon trennt.Alle von außerhalb der DLL aufgerufenen Funktionen (alle erweiterten gespeicherten Prozedur-Efunctions) müssen exportiert werden.
Man kann eine Funktion exportieren, indem man ihren Namen im Abschnitt
EXPORTSeiner.defDatei auflistet, oder man kann den Funktionsnamen im Quellcode mit__declspec(dllexport)einer Microsoft-Compiler-Erweiterung (__declspec()beginnt mit zwei Unterstrichen) voransetzen.
Diese Dateien sind erforderlich, um eine erweiterte gespeicherte Prozedur-DLL zu erstellen.
| Datei | Description |
|---|---|
srv.h |
Extended Stored Procedure API-Header-Datei |
opends60.lib |
Importbibliothek für opends60.dll |
Um eine erweiterte gespeicherte Prozedur-DLL zu erstellen, erstellen Sie ein Projekt vom Typ Dynamic Link Library. Weitere Informationen zur Erstellung einer DLL finden Sie in der Entwicklungsumgebungsdokumentation.
Alle erweiterten gespeicherten Prozedur-DLLs sollten folgende Funktion implementieren und exportieren:
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
__declspec(dllexport) ist eine Microsoft-spezifische Compiler-Erweiterung. Wenn dein Compiler diese Direktive nicht unterstützt, solltest du diese Funktion in deiner DEF Datei unter dem Abschnitt EXPORTS exportieren.
Wenn SQL Server mit dem Trace-Flag -T260 gestartet wird oder wenn ein Benutzer mit Systemadministrator-Rechten ausführt DBCC TRACEON (260)und die erweiterte gespeicherte Prozedur, die DLL nicht unterstützt __GetXpVersion(), wird die folgende Warnmeldung im Fehlerprotokoll ausgedruckt (__GetXpVersion() beginnt mit zwei Unterstrichen).
Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().
Wenn die erweiterte gespeicherte Prozedur DLL exportiert, __GetXpVersion()aber die von der Funktion zurückgegebene Version kleiner ist als die vom Server benötigte Version, wird eine Warnmeldung mit der von der Funktion zurückgegebenen Version und der vom Server erwarteten Version im Fehlerprotokoll ausgedruckt. Wenn du diese Meldung erhältst, gibst du einen falschen Wert von __GetXpVersion()zurück, oder du kompilierst mit einer älteren Version von srv.h.
Hinweis
SetErrorMode, eine Win32-Funktion, sollte in erweiterten gespeicherten Prozeduren nicht aufgerufen werden.
Langlaufende, erweiterte gespeicherte Prozeduren sollten periodisch aufgerufen srv_got_attention werden, damit das Verfahren sich selbst beenden kann, wenn die Verbindung abgeschaltet wird oder der Batch abgebrochen wird.
Um eine erweiterte gespeicherte Prozedur-DLL zu debuggen, kopiere sie in das SQL-Server-Verzeichnis \Binn . Um die ausführbare Datei für die Debugging-Sitzung zu spezifizieren, geben Sie den Pfad und Dateinamen der SQL Server-ausführbaren Datei ein (zum Beispiel, C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe). Informationen zu Argumenten sqlservr finden Sie unter sqlservr Application.
Fügen Sie SQL Server eine erweiterte gespeicherte Prozedur hinzu
Eine DLL, die erweiterte gespeicherte Prozedurfunktionen enthält, fungiert als Erweiterung von SQL Server. Um die DLL zu installieren, kopieren Sie die Datei in ein Verzeichnis, beispielsweise in das, das standardmäßig die Standard-SQL-Server-DLL-DateienC:\Program Files\Microsoft SQL Server\MSSQL16.0.<x>\MSSQL\Binn enthält.
Nachdem die erweiterte gespeicherte Prozedur-DLL auf den Server kopiert wurde, muss ein SQL-Server-Systemadministrator jede erweiterte gespeicherte Prozedurfunktion im DLL bei SQL Server registrieren. Dies geschieht über das sp_addextendedproc System Stored Procedure.
Von Bedeutung
Der Systemadministrator sollte ein erweitertes gespeichertes Verfahren gründlich prüfen, um sicherzustellen, dass es keinen schädlichen oder bösartigen Code enthält, bevor er es dem Server fügt und anderen Nutzern Ausführungsrechte erteilt. Überprüfen Sie alle Benutzereingaben. Verkette Benutzereingaben nicht, bevor du sie überprüft hast. Führen Sie niemals Befehle aus, die sich aus nicht überprüften Benutzereingaben zusammensetzen.
Der erste Parameter von sp_addextendedproc gibt den Namen der Funktion an, und der zweite Parameter den Namen der DLL, in der sich diese Funktion befindet. Du solltest den vollständigen Pfad der DLL angeben.
Hinweis
Bestehende DLLs, die nicht mit einem vollständigen Pfad registriert waren, funktionieren nach dem Upgrade auf SQL Server 2005 (9.x) oder eine spätere Version nicht mehr. Um das Problem zu beheben, deregistrieren sp_dropextendedproc Sie die DLL und registrieren sie dann erneut, indem sp_addextendedproc, Sie den vollständigen Pfad angeben.
Der Name der in sp_addextendedproc angegebenen Funktion muss genau derselbe sein, einschließlich des Falls, wie der Name der Funktion in der DLL. Zum Beispiel registriert dieser Befehl eine Funktion xp_hello, , die sich in einer DLL befindet, mit dem Namen xp_hello.dll, als SQL Server erweiterte gespeicherte Prozedur:
sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL13.0.MSSQLSERVER\MSSQL\Binn\xp_hello.dll';
Wenn der Name der in angegebenen sp_addextendedproc Funktion nicht exakt mit dem Funktionsnamen in der DLL übereinstimmt, wird der neue Name im SQL Server registriert, aber der Name ist nicht nutzbar. Zum Beispiel, obwohl xp_Hello als SQL Server Extended Stored Procedure registriert ist, kann xp_hello.dllSQL Server die Funktion in der DLL nicht finden, wenn man die Funktion später aufruft xp_Hello .
-- Register the function (xp_hello) with an initial upper case
sp_addextendedproc 'xp_Hello', 'c:\xp_hello.dll';
-- Use the newly registered name to call the function
DECLARE @txt VARCHAR(33);
EXEC xp_Hello @txt OUTPUT;
Dies ist die Fehlermeldung:
Server: Msg 17750, Level 16, State 1, Procedure xp_Hello, Line 1
Could not load the DLL xp_hello.dll, or one of the DLLs it references. Reason: 127(The specified procedure could not be found.).
Wenn der Name der in sp_addextendedproc in angegebenen Funktion exakt mit dem Funktionsnamen in der DLL übereinstimmt und die Sortierung der SQL-Server-Instanz farus-unempfindlich ist, kann der Benutzer die erweiterte gespeicherte Prozedur mit einer beliebigen Kombination aus Klein- und Großbuchstaben des Namens aufrufen.
-- Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';
-- The following example succeeds in calling xp_hello
DECLARE @txt VARCHAR(33);
EXEC xp_Hello @txt OUTPUT;
DECLARE @txt VARCHAR(33);
EXEC xp_HelLO @txt OUTPUT;
DECLARE @txt VARCHAR(33);
EXEC xp_HELLO @txt OUTPUT;
Wenn die Sortierung der SQL-Server-Instanz groß- und kleinschreibungssensitiv ist, kann SQL Server die erweiterte gespeicherte Prozedur nicht aufrufen, wenn die Prozedur mit einem anderen Case aufgerufen wird. Das gilt sogar, wenn sie mit genau demselben Namen und derselben Kollation wie die Funktion in der DLL registriert war.
-- Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';
-- The following example results in an error
DECLARE @txt VARCHAR(33);
EXEC xp_HELLO @txt OUTPUT;
Dies ist die Fehlermeldung:
Server: Msg 2812, Level 16, State 62, Line 1
Du musst SQL Server nicht anhalten und neu starten.
Abfrage erweiterter gespeicherter Prozeduren, die in SQL Server installiert wurden, abfragen
Ein SQL-Server-authentifizierter Benutzer kann die aktuell definierten erweiterten gespeicherten Prozeduren und den Namen der DLL, zu der jede gehört, durch Ausführung der sp_helpextendedproc Systemprozedur anzeigen. Zum Beispiel gibt das folgende Beispiel die DLL zurück, zu der xp_hello gehört:
sp_helpextendedproc 'xp_hello';
Wenn sp_helpextendedproc ausgeführt wird, ohne eine erweiterte gespeicherte Prozedur anzugeben, werden alle erweiterten gespeicherten Prozeduren und ihre DLLs angezeigt.
Entferne eine erweiterte gespeicherte Prozedur aus SQL Server
Um jede Funktion der erweiterten gespeicherten Prozedur in eine benutzerdefinierte erweiterte gespeicherte Prozedur-DLL zu entfernen, muss ein SQL-Server-Systemadministrator die sp_dropextendedproc systemgespeicherte Prozedur ausführen, wobei er den Namen der Funktion und den Namen der DLL, in der sich diese Funktion befindet, angeben. Zum Beispiel entfernt dieser Befehl die Funktion xp_hello, die in einer aus SQL Server benannten xp_hello.dll, DLL liegt:
sp_dropextendedproc 'xp_hello';
sp_dropextendedproc Es fallen keine System Extended Stored Procedures. Stattdessen sollte der Systemadministrator der öffentlichen Rolle die Erlaubnis für das erweiterte gespeicherte Verfahren verweigernEXECUTE.
Entladen Sie eine erweiterte gespeicherte Prozedur-DLL
SQL Server lädt eine erweiterte gespeicherte Prozedur-DLL, sobald eine Funktion der DLL aufgerufen wird. Die DLL bleibt geladen, bis der Server abgeschaltet wird oder der Systemadministrator die DBCC Anweisung nutzt, um sie zu entladen. Zum Beispiel entlädt dieser Befehl die xp_hello.dll, sodass der Systemadministrator eine neuere Version dieser Datei in das Verzeichnis kopieren kann, ohne den Server herunterzufahren:
DBCC xp_hello(FREE);
Verwandte Inhalte
- ClR-Integration (Common Language Runtime)
- CLR Table-Valued Funktionen
- Datenbank-Engine erweiterte gespeicherte Prozeduren – Programmierung
- Abfrage erweiterter gespeicherter Prozeduren, die in SQL Server installiert sind
- srv_got_attention (Erweiterte Stored Procedure API)
- sp_addextendedproc (Transact-SQL)
- sp_dropextendedproc (Transact-SQL)
- sp_helpextendedproc (Transact-SQL)
- DBCC dllname (KOSTENLOS) (Transact-SQL)