Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of mappen te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen om mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
Bewerkingen in een relationele database werken op een volledige set rijen. De set rijen die door een SELECT instructie worden geretourneerd, bestaat bijvoorbeeld uit alle rijen die voldoen aan de voorwaarden in de WHERE component van de instructie. Deze volledige set rijen die door de instructie worden geretourneerd, wordt de resultatenset genoemd. Toepassingen, met name interactieve onlinetoepassingen, kunnen niet altijd effectief werken met de volledige resultatenset als eenheid. Deze toepassingen hebben een mechanisme nodig om met één rij of een klein blok rijen tegelijk te werken. Cursors zijn een uitbreiding op resultatensets die dat mechanisme bieden.
Cursors breiden de verwerking van resultaten uit door:
Plaatsing op specifieke rijen van de resultatenset toestaan.
Eén rij of een blok rijen ophalen vanaf de huidige positie in de resultatenset.
Ondersteunen van gegevenswijzigingen in de rijen op de huidige positie in de resultaatset.
Ondersteuning voor verschillende zichtbaarheidsniveaus voor wijzigingen die andere gebruikers hebben aangebracht in de databasegegevens die worden weergegeven in de resultatenset.
Het verstrekken van Transact-SQL instructies in scripts, opgeslagen procedures en triggert toegang tot de gegevens in een resultatenset.
Opmerkingen
In sommige scenario's kan, als er een primaire sleutel in een tabel is, een WHILE lus worden gebruikt in plaats van een cursor, zonder dat er sprake is van overhead van een cursor.
Er zijn echter scenario's waarin cursors niet alleen onvermijdelijk zijn, ze zijn eigenlijk nodig. Als dat het geval is, en er is geen vereiste om tabellen bij te werken op basis van de cursor, gebruikt u firehose cursors, wat inhoudt dat u fast-forward en read-only cursors gebruikt.
Cursor-implementaties
SQL Server ondersteunt drie cursor-implementaties.
| Cursor-implementatie | Description |
|---|---|
| Transact-SQL-cursors | Transact-SQL cursors zijn gebaseerd op de DECLARE CURSOR syntaxis en worden voornamelijk gebruikt in Transact-SQL scripts, opgeslagen procedures en triggers. Transact-SQL cursors worden geïmplementeerd op de server en worden beheerd door Transact-SQL instructies die van de client naar de server worden verzonden. Ze kunnen ook worden opgenomen in batches, opgeslagen procedures of triggers. |
| Servercursor voor toepassingsprogrammatuurinterface (API) | API-cursors ondersteunen de functies van API-cursors in OLE DB en ODBC. API-servercursors worden geïmplementeerd op de server. Telkens wanneer een clienttoepassing een API-cursorfunctie aanroept, verzendt de OLE DB-provider van de SQL Server-client of het ODBC-stuurprogramma de aanvraag naar de server voor actie op basis van de CURSOR van de API-server. |
| Client-cursors | Clientcursors worden intern geïmplementeerd door het ODBC-stuurprogramma van sql Server Native Client en door de DLL waarmee de ADO-API wordt geïmplementeerd. Client cursors worden geïmplementeerd door alle rijen in de resultaatset op de client te cachen. Telkens wanneer een clienttoepassing een API-cursorfunctie aanroept, voert het ODBC-stuurprogramma van de SQL Server Native Client of het ADO-DLL de cursorbewerking uit op de resultatensetrijen die op de client in de cache zijn opgeslagen. |
Soorten cursors
SQL Server ondersteunt vier cursortypen.
Cursors kunnen werktabellen gebruiken tempdb . Net als bij aggregatie- of sorteerbewerkingen die overlopen, worden er I/O-kosten in rekening gebracht en kunnen prestatieknelpunten optreden.
STATIC cursors gebruiken werktabellen vanaf het begin. Zie de sectie werktabellen in de architectuurhandleiding voor queryverwerking voor meer informatie.
Alleen vooruit
Een alleen-vooruit-cursor is gespecificeerd als FORWARD_ONLY en READ_ONLY en biedt geen ondersteuning voor schuiven. Deze worden ook wel firehose cursors genoemd en ondersteunen alleen het serieel ophalen van de rijen vanaf het begin tot het einde van de cursor. De rijen worden pas uit de database opgehaald wanneer ze worden opgevraagd. De effecten van alle INSERT, UPDATEen DELETE instructies van de huidige gebruiker of doorgevoerd door andere gebruikers die van invloed zijn op rijen in de resultatenset, zijn zichtbaar wanneer de rijen van de cursor worden opgehaald.
Omdat de cursor niet naar achteren kan worden geschoven, zijn de meeste wijzigingen in rijen in de database nadat de rij is opgehaald, niet zichtbaar via de cursor. In gevallen waarin een waarde die wordt gebruikt om de locatie van de rij in de resultatenset te bepalen, wordt gewijzigd, zoals het bijwerken van een kolom die wordt gedekt door een geclusterde index, is de gewijzigde waarde zichtbaar via de cursor.
Hoewel de database-API-cursormodellen een cursor met alleen-doorsturen beschouwen als een uniek type cursor, doet SQL Server dat niet. SQL Server beschouwt zowel forward-only als scroll als opties die kunnen worden toegepast op statische, keysetgestuurde en dynamische cursors. Transact-SQL cursors ondersteunen vooruit-alleen statische, sleutelsetgestuurde en dynamische cursors. Bij de database-API-cursormodellen wordt ervan uitgegaan dat statische, sleutelsetgestuurde en dynamische cursors altijd kunnen worden geschoven. Wanneer een database-API-cursorkenmerk of -eigenschap is ingesteld op alleen-doorsturen, implementeert SQL Server dit als een dynamische cursor die alleen doorsturen is.
Statisch
De volledige resultatenset van een statische cursor is ingebouwd tempdb wanneer de cursor wordt geopend. Een statische cursor geeft altijd de resultatenset weer zoals deze was toen de cursor werd geopend. Statische cursors detecteren weinig of geen wijzigingen, maar verbruiken relatief weinig resources tijdens het schuiven.
De cursor geeft geen wijzigingen weer die zijn aangebracht in de database die van invloed zijn op het lidmaatschap van de resultatenset of wijzigingen in de waarden in de kolommen van de rijen waaruit de resultatenset bestaat. Een statische cursor geeft geen nieuwe rijen weer die in de database zijn ingevoegd nadat de cursor is geopend, zelfs niet als deze overeenkomen met de zoekvoorwaarden van de cursorinstructie SELECT . Als rijen die de resultatenset vormen, worden bijgewerkt door andere gebruikers, worden de nieuwe gegevenswaarden niet weergegeven in de statische cursor. De statische cursor geeft rijen weer die uit de database zijn verwijderd nadat de cursor is geopend. Nee UPDATE, INSERTof DELETE bewerkingen worden weergegeven in een statische cursor (tenzij de cursor is gesloten en opnieuw wordt geopend), zelfs geen wijzigingen die zijn aangebracht met behulp van dezelfde verbinding die de cursor heeft geopend.
Opmerking
Statische SQL Server-cursors zijn altijd alleen-lezen.
Omdat de resultatenset van een statische cursor is opgeslagen in een werktabel tempdb, kan de grootte van de rijen in de resultatenset de maximale rijgrootte voor een SQL Server-tabel niet overschrijden.
Zie de sectie werktabellen in de architectuurhandleiding voor queryverwerking voor meer informatie. Zie Maximum capaciteitsspecificaties voor SQL Server voor meer informatie over de maximale rijgrootte.
Transact-SQL gebruikt de term ongevoelig voor statische cursors. Sommige database-API's identificeren deze als momentopnamecursors .
Keyset
De samenstelling en volgorde van rijen in een sleutelsetgestuurde cursor worden vastgelegd wanneer de cursor wordt geopend. Sleutelsetgestuurde cursors worden beheerd door een set unieke id's of sleutels, ook wel de sleutelset genoemd. De sleutels zijn opgebouwd uit een set kolommen waarmee de rijen in de resultatenset uniek worden geïdentificeerd. De sleutelset is de set van de sleutelwaarden uit alle rijen die zijn gekwalificeerd voor de SELECT instructie op het moment dat de cursor werd geopend. De sleutelset voor een toetssetgestuurde cursor wordt ingebouwd tempdb wanneer de cursor wordt geopend.
Dynamisch
Dynamische cursors zijn het tegenovergestelde van statische cursors. Dynamische cursors weerspiegelen alle wijzigingen die in de rijen in de resultatenset zijn aangebracht wanneer u door de cursor bladert. De gegevenswaarden, volgorde en lidmaatschap van de rijen in de resultatenset kunnen worden gewijzigd bij elke ophaalopdracht. Alle UPDATE, INSERTen DELETE instructies van alle gebruikers zijn zichtbaar via de cursor. Updates zijn onmiddellijk zichtbaar als ze via de cursor worden gemaakt met behulp van een API-functie, zoals SQLSetPos of de Transact-SQL-component WHERE CURRENT OF . Updates die buiten de cursor zijn gemaakt, worden pas zichtbaar wanneer ze zijn doorgevoerd, tenzij het isolatieniveau van de cursortransactie is ingesteld op niet-gecomitteerde lees. Zie SET TRANSACTION ISOLATION LEVEL (Transact-SQL) voor meer informatie over isolatieniveaus.
Opmerking
Dynamische cursorplannen maken nooit gebruik van ruimtelijke indexen.
Een cursor aanvragen
SQL Server ondersteunt twee methoden voor het aanvragen van een cursor:
-
Transact-SQL
De Transact-SQL taal ondersteunt een syntaxis voor het gebruik van cursors die zijn gemodelleerd na de ISO-cursorsyntaxis.
Cursorfuncties van de programmeerinterface (API) voor databasetoepassingen
SQL Server ondersteunt de cursorfunctionaliteit van deze database-API's:
ADO (Microsoft ActiveX-gegevensobject)
OLE DB
ODBC (Open Database Connectivity)
Een toepassing mag deze twee methoden voor het aanvragen van een cursor nooit combineren. Een toepassing die gebruikmaakt van de API om cursorgedrag op te geven, moet dan geen Transact-SQL DECLARE CURSOR instructie uitvoeren om ook een Transact-SQL cursor aan te vragen. Een toepassing moet alleen worden uitgevoerd DECLARE CURSOR als alle API-cursorkenmerken weer worden ingesteld op de standaardinstellingen.
Als er geen Transact-SQL of API-cursor wordt aangevraagd, retourneert SQL Server standaard een volledige resultatenset, ook wel een standaardresultatenset genoemd, naar de toepassing.
Cursorproces
Transact-SQL cursors en API-cursors verschillende syntaxis hebben, maar het volgende algemene proces wordt gebruikt met alle SQL Server-cursors:
Koppel een cursor aan de resultatenset van een Transact-SQL-instructie en definieer kenmerken van de cursor, zoals of de rijen in de cursor kunnen worden bijgewerkt.
Voer de Transact-SQL-instructie uit om de cursor te vullen.
Haal de rijen op in de cursor die u wilt zien. De bewerking voor het ophalen van één rij of één blok rijen van een cursor wordt een ophalen genoemd. Het uitvoeren van een reeks ophaalbewerkingen voor het ophalen van rijen in een voorwaartse of achterwaartse richting wordt scrollen genoemd.
U kunt desgewenst wijzigingsbewerkingen uitvoeren (bijwerken of verwijderen) op de rij op de huidige positie in de cursor.
Sluit de cursor.