Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Belangrijk
Deze functie wordt verwijderd in een toekomstige versie van SQL Server. Vermijd het gebruik van deze functie in nieuwe ontwikkelwerkzaamheden en plan om toepassingen te wijzigen die momenteel gebruikmaken van deze functie. Gebruik in plaats daarvan CLR-integratie .
Hoe uitgebreide opgeslagen procedures werken
Het proces waarmee een uitgebreide opgeslagen procedure werkt, is:
Wanneer een client een uitgebreide opgeslagen procedure uitvoert, wordt het verzoek verzonden in tabular data stream (TDS) of Simple Object Access Protocol (SOAP) formaat van de clientapplicatie naar SQL Server.
SQL Server zoekt naar de DLL die gekoppeld is aan de uitgebreide opgeslagen procedure, en laadt de DLL als deze nog niet geladen is.
SQL Server roept de gevraagde uitgebreide opgeslagen procedure aan (geïmplementeerd als een functie binnen de DLL).
De uitgebreide opgeslagen procedure geeft resultaatsets en retourparameters terug aan de server via de Extended Stored Procedure API.
In het verleden werd Open Data Services gebruikt om serverapplicaties te schrijven, zoals gateways naar niet-SQL Server databaseomgevingen. SQL Server ondersteunt de verouderde delen van de Open Data Services API niet. Het enige deel van de oorspronkelijke Open Data Services API dat nog door SQL Server wordt ondersteund, zijn de uitgebreide stored procedure-functies, dus de API werd hernoemd naar de Extended Stored Procedure API.
Met de opkomst van gedistribueerde queries en CLR-integratie is de behoefte aan Extended Stored Procedure API-toepassingen grotendeels vervangen.
Als je bestaande gateway-applicaties hebt, kun je de opends60.dll software die bij SQL Server wordt geleverd niet gebruiken om de applicaties uit te voeren. Gateway-applicaties worden niet langer ondersteund.
Uitgebreide opgeslagen procedures versus CLR-integratie
CLR-integratie biedt een robuuster alternatief voor het schrijven van server-side logica die moeilijk uit te drukken was of onmogelijk te schrijven in Transact-SQL. In eerdere versies van SQL Server boden uitgebreide opgeslagen procedures (XP's) het enige mechanisme dat beschikbaar was voor ontwikkelaars van databaseapplicaties om dergelijke code te schrijven.
Bij CLR-integratie kan logica die vroeger in de vorm van opgeslagen procedures werd geschreven, vaak beter worden uitgedrukt als tabelwaardige functies, waarmee de resultaten die door de functie zijn geconstrueerd in statements kunnen worden bevraagd SELECT door ze in de clausule in te FROM bedden.
Voor meer informatie, zie CLR-integratieoverzicht.
Uitvoeringskenmerken van uitgebreide opgeslagen procedures
De uitvoering van een uitgebreide opgeslagen procedure heeft de volgende kenmerken:
De uitgebreide stored procedure-functie wordt uitgevoerd onder de beveiligingscontext van SQL Server.
De uitgebreide stored procedure-functie draait in de procesruimte van SQL Server.
De thread die hoort bij de uitvoering van de uitgebreide opgeslagen procedure is dezelfde die wordt gebruikt voor de clientverbinding.
Belangrijk
Voordat uitgebreide opgeslagen procedures aan de server worden toegevoegd en uitvoeringsrechten aan andere gebruikers worden toegekend, moet de systeembeheerder elke uitgebreide opgeslagen procedure grondig beoordelen om te controleren of deze geen schadelijke of kwaadaardige code bevat.
Nadat de extended stored procedure DLL is geladen, blijft de DLL geladen in de adresruimte van de server totdat SQL Server wordt gestopt of de beheerder de DLL expliciet ontlaadt door gebruik te maken DBCC <DLL_name> (FREE)van .
De uitgebreide opgeslagen procedure kan vanuit Transact-SQL als opgeslagen procedure worden uitgevoerd door gebruik te maken van de EXECUTE instructie:
EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT;
Parameterwaarden
@ Retval
Een rendementswaarde.
@ param1
Een invoerparameter.
@ param2
Een invoer-/uitvoerparameter.
Waarschuwing
Uitgebreide opgeslagen procedures bieden prestatieverbeteringen en vergroten de functionaliteit van SQL Server. Omdat de uitgebreide opgeslagen procedure DLL en SQL Server echter dezelfde adresruimte delen, kan een probleemprocedure de werking van SQL Server negatief beïnvloeden. Hoewel uitzonderingen die door de extended stored procedure DLL worden gegooid worden afgehandeld door SQL Server, is het mogelijk dat SQL Server-datagebieden beschadigd raken. Als beveiligingsmaatregel kunnen alleen SQL Server-systeembeheerders uitgebreide opgeslagen procedures toevoegen aan SQL Server. Deze procedures moeten grondig worden getest voordat ze worden geïnstalleerd.
Stuur resultaatsets naar de server met Extended Stored Procedure API
Bij het verzenden van een resultaatset naar SQL Server moet de uitgebreide opgeslagen procedure de juiste API als volgt aanroepen:
De
srv_sendmsgfunctie kan in willekeurige volgorde worden aangeroepen vóór of na alle rijen (indien aanwezig) metsrv_sendrow. Alle berichten moeten naar de client worden gestuurd voordat de voltooiingsstatus wordt verzonden metsrv_senddone.De
srv_sendrowfunctie wordt eenmaal aangeroepen voor elke rij die naar de client wordt gestuurd. Alle rijen moeten naar de client worden gestuurd voordat berichten, statuswaarden of voltooiingsstatussen worden verzonden metsrv_sendmsg, hetsrv_statusargument vansrv_pfield, ofsrv_senddone.Het verzenden van een rij waarvan niet alle kolommen zijn gedefinieerd
srv_describe, zorgt ervoor dat de applicatie een informatiefoutmelding geeft en terugkeertFAILnaar de client. In dit geval wordt de rij niet verzonden.
Maak uitgebreide opgeslagen procedures aan
Een uitgebreide opgeslagen procedure is een C/C++-functie met een prototype:
SRVRETCODE xp_extendedProcName (SRVPROC *);
Het gebruik van het voorvoegsel xp_ is optioneel. Namen van uitgebreide opgeslagen procedures zijn hoofdlettergevoelig wanneer ze in Transact-SQL statements worden genoemd, ongeacht de codepagina/sorteervolgorde die op de server is geïnstalleerd. Wanneer je een DLL bouwt:
Als een instappunt nodig is, schrijf dan een
DllMainfunctie.Deze functie is optioneel. Als je het niet in de broncode aanlevert, linkt de compiler zijn eigen versie, die alleen maar teruggeeft
TRUE. Als je eenDllMainfunctie aangeeft, roept het besturingssysteem deze functie aan wanneer een thread of proces zich hecht aan of loskoppelt van de DLL.Alle functies die van buiten de DLL worden aangeroepen (alle uitgebreide opgeslagen procedure Efunctions) moeten geëxporteerd worden.
Je kunt een functie exporteren door de naam ervan in het
EXPORTSgedeelte van een.defbestand te vermelden, of je kunt de functienaam in de broncode voorafgaan met__declspec(dllexport), een Microsoft-compilerextensie (__declspec()begint met twee onderstreepjes).
Deze bestanden zijn vereist voor het creëren van een uitgebreide opgeslagen procedure DLL.
| Bestand | Description |
|---|---|
srv.h |
Extended Stored Procedure API-headerbestand |
opends60.lib |
Importbibliotheek voor opends60.dll |
Om een uitgebreide opgeslagen procedure DLL te maken, maak je een project van het type Dynamic Link Library. Voor meer informatie over het maken van een DLL, zie de documentatie voor de ontwikkelomgeving.
Alle uitgebreide stored procedure DLL's moeten de volgende functie implementeren en exporteren:
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
__declspec(dllexport) is een Microsoft-specifieke compilerextensie. Als je compiler deze richtlijn niet ondersteunt, zou je deze functie moeten exporteren in je DEF bestand onder de EXPORTS sectie.
Wanneer SQL Server wordt gestart met de trace-vlag -T260 of als een gebruiker met systeembeheerdersrechten uitvoert DBCC TRACEON (260), en als de uitgebreide opgeslagen procedure DLL niet ondersteunt __GetXpVersion(), wordt het volgende waarschuwingsbericht afgedrukt in het foutlogboek (__GetXpVersion() begint met twee onderscores).
Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().
Als de uitgebreide opgeslagen procedure DLL exporteert __GetXpVersion(), maar de versie die door de functie wordt geretourneerd kleiner is dan de versie die door de server vereist is, wordt een waarschuwingsbericht afgedrukt met de versie die door de functie wordt teruggegeven en de versie die door de server wordt verwacht, naar het foutlogboek. Als je deze melding krijgt, geef je een onjuiste waarde terug uit __GetXpVersion(), of compileer je met een oudere versie van srv.h.
Opmerking
SetErrorMode, een Win32-functie, zou niet aangeroepen moeten worden in uitgebreide opgeslagen procedures.
Langlopende uitgebreide opgeslagen procedures moeten periodiek worden aangeroepen srv_got_attention , zodat de procedure zichzelf kan beëindigen als de verbinding wordt verbroken of de batch wordt afgebroken.
Om een uitgebreide opgeslagen procedure DLL te debuggen, kopieer deze naar de SQL Server-map \Binn . Om het uitvoerbare bestand voor de debugsessie te specificeren, voer je het pad en de bestandsnaam van het SQL Server-uitvoerbare bestand in (bijvoorbeeld, C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe). Voor informatie over sqlservr argumenten, zie sqlservr Application.
Voeg een uitgebreide opgeslagen procedure toe aan SQL Server
Een DLL die uitgebreide opgeslagen procedurefuncties bevat, fungeert als een uitbreiding van SQL Server. Om de DLL te installeren, kopieer je het bestand naar een map, zoals die welke standaard SQL Server DLL-bestanden bevat (C:\Program Files\Microsoft SQL Server\MSSQL16.0.<x>\MSSQL\Binn standaard).
Nadat de extended stored procedure DLL naar de server is gekopieerd, moet een SQL Server-systeembeheerder elke uitgebreide opgeslagen procedurefunctie in de DLL registreren bij SQL Server. Dit gebeurt met behulp van de sp_addextendedproc systeemopgeslagen procedure.
Belangrijk
De systeembeheerder moet een uitgebreide opgeslagen procedure grondig beoordelen om te waarborgen dat deze geen schadelijke of kwaadaardige code bevat voordat deze aan de server wordt toegevoegd en uitvoeringsrechten aan andere gebruikers wordt verleend. Valideer alle gebruikersinvoer. Zet gebruikersinvoer niet samen voordat je het hebt gevalideerd. Voer nooit een opdracht uit die is samengesteld op basis van niet-gevalideerde gebruikersinvoer.
De eerste parameter van sp_addextendedproc specificeert de naam van de functie, en de tweede parameter geeft de naam aan van de DLL waarin die functie zich bevindt. Je moet het volledige pad van de DLL specificeren.
Opmerking
Bestaande DLL's die niet met een volledig pad geregistreerd waren, werken niet na een upgrade naar SQL Server 2005 (9.x) of een latere versie. Om het probleem op te lossen, gebruik sp_dropextendedproc je het verwijderen van de DLL en registreer je deze vervolgens opnieuw met het specificeren van sp_addextendedproc, het volledige pad.
De naam van de functie die in sp_addextendedproc wordt gespecificeerd, moet exact hetzelfde zijn, inclusief het geval, als de naam van de functie in de DLL. Dit commando registreert bijvoorbeeld een functie xp_hello, die zich bevindt in een dll genaamd xp_hello.dll, als een SQL Server uitgebreide opgeslagen procedure:
sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL13.0.MSSQLSERVER\MSSQL\Binn\xp_hello.dll';
Als de naam van de functie die in sp_addextendedproc wordt gespecificeerd niet exact overeenkomt met de functienaam in de DLL, wordt de nieuwe naam geregistreerd in SQL Server, maar de naam is niet bruikbaar. Bijvoorbeeld, hoewel xp_Hello geregistreerd is als een SQL Server uitgebreide opgeslagen procedure in xp_hello.dll, kan SQL Server de functie niet vinden in de DLL als je de functie later aanroept 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;
Dit is het foutbericht:
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.).
Als de naam van de functie die in wordt gespecificeerd exact sp_addextendedproc overeenkomt met de functienaam in de DLL, en de rangatie van de SQL Server-instantie is hoofdlettergevoelig, kan de gebruiker de uitgebreide opgeslagen procedure aanroepen met een willekeurige combinatie van kleine en hoofdletters van de naam.
-- 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;
Wanneer de collatie van de SQL Server-instantie hoofdlettergevoelig is, kan SQL Server de uitgebreide stored procedure niet aanroepen als de procedure met een andere case wordt aangeroepen. Dit geldt zelfs als het geregistreerd was met exact dezelfde naam en collatie als de functie in de DLL.
-- 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;
Dit is het foutbericht:
Server: Msg 2812, Level 16, State 62, Line 1
Je hoeft SQL Server niet te stoppen en opnieuw op te starten.
Zoek uitgebreide opgeslagen procedures op die zijn geïnstalleerd in SQL Server
Een geauthenticeerde gebruiker met SQL Server kan de momenteel gedefinieerde uitgebreide opgeslagen procedures en de naam van de DLL waartoe elke functie behoort weergeven door de systeemprocedure uit te sp_helpextendedproc voeren. Bijvoorbeeld, het volgende voorbeeld geeft de DLL terug waartoe xp_hello behoort:
sp_helpextendedproc 'xp_hello';
Als sp_helpextendedproc wordt uitgevoerd zonder een uitgebreide opgeslagen procedure te specificeren, worden alle uitgebreide opgeslagen procedures en hun DLL's weergegeven.
Verwijder een uitgebreide opgeslagen procedure uit SQL Server
Om elke uitgebreide opgeslagen procedurefunctie in een door de gebruiker gedefinieerde uitgebreide opgeslagen procedure DLL te verwijderen, moet een SQL Server-systeembeheerder de sp_dropextendedproc systeemopgeslagen procedure uitvoeren, waarbij de naam van de functie en de naam van de DLL waarin die functie zich bevindt worden gespecificeerd. Bijvoorbeeld, dit commando verwijdert de functie xp_hello, die zich bevindt in een DLL die uit SQL Server is genoemd xp_hello.dll, :
sp_dropextendedproc 'xp_hello';
sp_dropextendedproc Sluit geen systeem-uitgebreide opgeslagen procedures af. In plaats daarvan zou de systeembeheerder toestemming voor de uitgebreide opgeslagen procedure aan de publieke rol moeten EXECUTE weigeren.
Laad een uitgebreide opgeslagen procedure DLL uit
SQL Server laadt een uitgebreide stored procedure DLL zodra er een aanroep wordt gedaan naar een van de functies van de DLL. De DLL blijft geladen totdat de server wordt uitgeschakeld of totdat de systeembeheerder de DBCC instructie gebruikt om deze te ontladen. Bijvoorbeeld, dit commando ontlaadt de xp_hello.dll, waardoor de systeembeheerder een nieuwere versie van dit bestand naar de map kan kopiëren zonder de server uit te schakelen:
DBCC xp_hello(FREE);
Verwante inhoud
- Integratie van Common Language Runtime (CLR)
- CLR Table-Valued Functies
- Database Engine Uitgebreide Opgeslagen Procedures - Programmeren
- Het opvragen van uitgebreide opgeslagen procedures geïnstalleerd in SQL Server
- srv_got_attention (Uitgebreide Opgeslagen Procedure API)
- sp_addextendedproc (Transact-SQL)
- sp_dropextendedproc (Transact-SQL)
- sp_helpextendedproc (Transact-SQL)
- DBCC dllname (GRATIS) (Transact-SQL)