Delen via


sp_cursoropen (Transact-SQL)

van toepassing op:SQL Server-

Hiermee opent u een cursor. sp_cursoropen definieert de SQL-instructie die is gekoppeld aan de cursor- en cursoropties en vult de cursor vervolgens in. sp_cursoropen is gelijk aan de combinatie van de Transact-SQL-instructies DECLARE_CURSOR en OPEN. Deze procedure wordt aangeroepen door ID = 2 op te geven in een TDS-pakket (tabellaire gegevensstroom).

Transact-SQL syntaxisconventies

Syntaxis

sp_cursoropen cursor OUTPUT
    , stmt
    [ , scrollopt [ OUTPUT ]
    [ , ccopt [ OUTPUT ]
    [ , rowcount OUTPUT [ , boundparam ] [ , ...n ] ] ] ]
[ ; ]

Argumenten

Belangrijk

Argumenten voor uitgebreide opgeslagen procedures moeten worden ingevoerd in de specifieke volgorde, zoals beschreven in de sectie Syntaxis. Als de parameters niet in de volgorde zijn ingevoerd, treedt er een foutbericht op.

cursor

Een door SQL Server gegenereerde cursor-id. cursor is een handle waarde die moet worden opgegeven voor alle volgende procedures met de cursor, zoals sp_cursorfetch. De cursor parameter is int en kan niet worden NULL.

cursor kunnen meerdere cursors actief zijn op één databaseverbinding.

stmt-

Een vereiste parameter waarmee de resultatenset van de cursor wordt gedefinieerd. Elke geldige querytekenreeks (syntaxis en binding) van elk tekenreekstype (ongeacht Unicode, grootte, enzovoort) kan fungeren als een geldig stmt waardetype.

Schuifoptie. De parameter scrollopt is int, met een standaardwaarde van NULLen kan een van de volgende waarden zijn.

Waarde Beschrijving
0x0001 KEYSET
0x0002 DYNAMIC
0x0004 FORWARD_ONLY
0x0008 STATIC
0x10 FAST_FORWARD
0x1000 PARAMETERIZED_STMT
0x2000 AUTO_FETCH
0x4000 AUTO_CLOSE
0x8000 CHECK_ACCEPTED_TYPES
0x10000 KEYSET_ACCEPTABLE
0x20000 DYNAMIC_ACCEPTABLE
0x40000 FORWARD_ONLY_ACCEPTABLE
0x80000 STATIC_ACCEPTABLE
0x100000 FAST_FORWARD_ACCEPTABLE

Vanwege de mogelijkheid dat de aangevraagde waarde niet geschikt is voor de cursor die is gedefinieerd door stmt-, dient deze parameter als invoer en uitvoer. In dergelijke gevallen wijst SQL Server een geschikte waarde toe.

Optie voor gelijktijdigheidsbeheer. is een optionele parameter waarvoor een van de volgende invoerwaarden is vereist.

Waarde Beschrijving
0x0001 READ_ONLY
0x0002 SCROLL_LOCKS (voorheen bekend als LOCKCC)
0x0004 OPTIMISTIC (voorheen bekend als OPTCC)
0x0008 OPTIMISTIC (voorheen bekend als OPTCCVAL)
0x2000 ALLOW_DIRECT
0x4000 UPDT_IN_PLACE
0x8000 CHECK_ACCEPTED_OPTS
0x10000 READ_ONLY_ACCEPTABLE
0x20000 SCROLL_LOCKS_ACCEPTABLE
0x40000 OPTIMISTIC_ACCEPTABLE
0x80000 OPTIMISITC_ACCEPTABLE

Net als bij scrollopt, kan SQL Server de aangevraagde waarden overschrijven.

aantal rijen

Het aantal ophaalbufferrijen dat moet worden gebruikt met AUTO_FETCH. De standaardwaarde is 20 rijen. rowcount zich anders gedraagt wanneer deze is toegewezen als invoerwaarde versus een retourwaarde.

Als invoerwaarde Als retourwaarde
Wanneer de AUTO_FETCHscrollopt waarde is opgegeven, geeft rowcount het aantal rijen aan dat in de ophaalbuffer moet worden geplaatst.

Opmerking:> 0 is een geldige waarde wanneer AUTO_FETCH is opgegeven, maar anders wordt genegeerd.
Vertegenwoordigt het aantal rijen in de resultatenset, behalve wanneer de scrolloptAUTO_FETCH waarde is opgegeven.

afhankelijke

Hiermee wordt het gebruik van extra parameters opgegeven. boundparam is een optionele parameter die moet worden opgegeven als de PARAMETERIZED_STMT waarde is ingesteld op ON.

Codewaarden retourneren

Als er geen fout optreedt, retourneert sp_cursoropen een van de volgende waarden.

Waarde Beschrijving
0 De procedure is uitgevoerd.
0x0001 Er is een fout opgetreden tijdens de uitvoering (een kleine fout, niet ernstig genoeg om een fout in de bewerking te genereren).
0x0002 Er wordt een asynchrone bewerking uitgevoerd.
0x0002 Er wordt een FETCH bewerking uitgevoerd.
A De toewijzing van deze cursor is opgeheven en is niet beschikbaar.

Wanneer er een fout optreedt, kunnen de retourwaarden inconsistent zijn en kan de nauwkeurigheid niet worden gegarandeerd.

Wanneer de rowcount parameter is opgegeven als een retourwaarde, vindt de volgende resultatenset plaats.

Waarde Beschrijving
-1 Geretourneerd als het aantal rijen onbekend of niet van toepassing is.
-n Wordt geretourneerd wanneer een asynchrone populatie van kracht is. Vertegenwoordigt het aantal rijen dat in de ophaalbuffer is geplaatst wanneer de scrolloptAUTO_FETCH waarde is opgegeven.

Als RPC wordt gebruikt, zijn de retourwaarden als volgt.

Waarde Beschrijving
0 De procedure is geslaagd.
1 Procedure is mislukt.
2 Een keysetcursor wordt asynchroon gegenereerd.
16 Er is automatisch een snelcursor gesloten.

Als de sp_cursoropen-procedure is uitgevoerd, worden de RPC-retourparameters en een resultatenset met informatie over de TDS-kolomindeling (0xa0 en 0xa1 berichten) verzonden. Als dit niet lukt, worden een of meer TDS-foutberichten verzonden. In beide gevallen worden er geen rijgegevens geretourneerd en wordt het aantal DONE berichten 0. 0x81 wordt geretourneerd (standaard voor SELECT instructies) samen met de 0xa5- en 0xa4 tokenstreams.

Opmerkingen

De parameter stmt

Als stmt- de uitvoering van een opgeslagen procedure opgeeft, kunnen de invoerparameters worden gedefinieerd als constanten als onderdeel van de stmt tekenreeks, of opgegeven als afhankelijkeparam argumenten. Gedeclareerde variabelen kunnen op deze manier worden doorgegeven als afhankelijke parameters.

De toegestane inhoud van de parameter stmt is afhankelijk van het feit of de ALLOW_DIRECT retourwaarde door OR is gekoppeld aan de rest van de waarden:

  • Als ALLOW_DIRECT niet is opgegeven, moet een Transact-SQL SELECT- of EXECUTE-instructie voor een opgeslagen procedure met één SELECT instructie worden gebruikt. Bovendien moet de SELECT-instructie als cursor kwalificeren; dat wil gezegd, het kan de trefwoorden SELECT INTO of FOR BROWSEniet bevatten.

  • Als ALLOW_DIRECT is opgegeven, kan dit leiden tot een of meer Transact-SQL instructies, inclusief instructies die andere opgeslagen procedures uitvoeren met meerdere instructies. Niet-SELECT instructies of een SELECT-instructie die de trefwoorden SELECT INTO of FOR BROWSE bevat, worden uitgevoerd en leiden niet tot het maken van een cursor. Hetzelfde geldt voor elke SELECT instructie die is opgenomen in een batch met meerdere instructies. In gevallen waarin een SELECT instructie componenten bevat die alleen betrekking hebben op cursors, worden deze componenten genegeerd. Wanneer de waarde van bijvoorbeeld 0x2002is, is dit een aanvraag voor:

    • Een cursor met schuifvergrendelingen, als er slechts één SELECT instructie is die als cursor in aanmerking komt, of

    • Een directe instructieuitvoering als er meerdere instructies zijn, één niet-SELECT instructie of een SELECT-instructie die niet als cursor in aanmerking komt.

De parameter scrollopt

De eerste vijf scrollopt waarden (KEYSEY, DYNAMIC, FORWARD_ONLY, STATICen FAST_FORWARD) sluiten elkaar wederzijds uit.

PARAMETERIZED_STMT en CHECK_ACCEPTED_TYPES kunnen worden gekoppeld door OR aan een van de eerste vijf waarden.

AUTO_FETCH en AUTO_CLOSE kunnen door OR aan FAST_FORWARDworden gekoppeld.

Als CHECK_ACCEPTED_TYPESONis, moeten ten minste één van de laatste vijf waarden (KEYSET_ACCEPTABLE, DYNAMIC_ACCEPTABLE, FORWARD_ONLY_ACCEPTABLE, STATIC_ACCEPTABLEof FAST_FORWARD_ACCEPTABLE) ook ONzijn.

STATIC cursors worden altijd geopend als READ_ONLY. Dit betekent dat de onderliggende tabel niet kan worden bijgewerkt via deze cursor.

De parameter

De eerste vier waarden (READ_ONLY, SCROLL_LOCKSen beide OPTIMISTIC waarden) sluiten elkaar wederzijds uit.

Notitie

Als u een van de eerste vier ccopt waarden kiest, bepaalt u of de cursor alleen-lezen is of als vergrendelings- of optimistische methoden worden gebruikt om verloren updates te voorkomen. Als een waarde niet is opgegeven, wordt de standaardwaarde OPTIMISTIC.

ALLOW_DIRECT en CHECK_ACCEPTED_TYPES kunnen worden gekoppeld door OR aan een van de eerste vier waarden.

UPDT_IN_PLACE kunnen door OR worden gekoppeld aan READ_ONLY, SCROLL_LOCKSof een van de OPTIMISTIC-waarden.

Als CHECK_ACCEPTED_TYPES is ON, moet ten minste één van de laatste vier waarden (READ_ONLY_ACCEPTABLE, SCROLL_LOCKS_ACCEPTABLEen een van de OPTIMISTIC_ACCEPTABLE waarden) ook AAN zijn.

Positioned UPDATE- en DELETE-functies kunnen alleen binnen de ophaalbuffer worden uitgevoerd en alleen als de waarde gelijk is aan SCROLL_LOCKS of OPTIMISTIC. Als SCROLL_LOCKS de opgegeven waarde is, slaagt de bewerking gegarandeerd. Als OPTIMISTIC de opgegeven waarde is, mislukt de bewerking als de rij is gewijzigd sinds deze voor het laatst is opgehaald.

De reden voor deze fout is dat wanneer OPTIMISTIC de opgegeven waarde is, een optimistische valutacontrolefunctie wordt uitgevoerd door tijdstempels of controlesomwaarden te vergelijken, zoals bepaald door SQL Server. Als een van deze rijen niet overeenkomt, mislukt de bewerking.

Het opgeven van UPDT_IN_PLACE als de retourwaarde bepaalt de volgende resultaten:

  • Als deze niet is ingesteld bij het uitvoeren van een geplaatste update voor een tabel met een unieke index, verwijdert de cursor de rij uit de werktabel en voegt deze in aan het einde van een van de sleutelkolommen die door de cursor worden gebruikt, waardoor deze kolommen worden gewijzigd.

  • Als ONis ingesteld, werkt de cursor de sleutelkolommen in de oorspronkelijke rij van de werktabel bij.

De parameter bound_param

De parameternaam moet worden paramdef- wanneer PARAMETERIZED_STMT is opgegeven, volgens het foutbericht in de code. Wanneer PARAMETERIZED_STMT niet is opgegeven, wordt er geen naam opgegeven in het foutbericht.

RPC-overwegingen

De RPC-RETURN_METADATA invoervlag kan worden ingesteld op 0x0001 om aan te vragen dat metagegevens van de cursorlijst selecteren wordt geretourneerd in de TDS-stroom.

Voorbeelden

Een. De parameter bound_param

Parameters na de vijfde worden als invoerparameters doorgegeven aan het instructieplan. De eerste parameter moet een tekenreeks in de volgende vorm zijn:

<parameter_name> <data_type> [ ,... n ]

Volgende parameters worden gebruikt om de waarden door te geven die moeten worden vervangen door de <parameter_name> in de instructie.