Dela via


sp_cursoropen (Transact-SQL)

gäller för:SQL Server

Öppnar en markör. sp_cursoropen definierar SQL-instruktionen som är associerad med markören och markörens alternativ och fyller sedan i markören. sp_cursoropen motsvarar kombinationen av Transact-SQL-uttrycken DECLARE_CURSOR och OPEN. Den här proceduren anropas genom att ange ID = 2 i ett TDS-paket (Tabular Data Stream).

Transact-SQL syntaxkonventioner

Syntax

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

Argument

Viktig

Argument för utökade lagrade procedurer måste anges i den specifika ordning som beskrivs i avsnittet Syntax. Om parametrarna anges i fel ordning visas ett felmeddelande.

markören

En SQL Server-genererad marköridentifierare. markören är ett handle värde som måste anges för alla efterföljande procedurer som involverar markören, till exempel sp_cursorfetch. -markören parametern är int och kan inte NULL.

markören gör att flera markörer kan vara aktiva på en enda databasanslutning.

stmt

En obligatorisk parameter som definierar markörens resultatuppsättning. Alla giltiga frågesträngar (syntax och bindningar) av valfri strängtyp (oavsett Unicode, storlek osv.) kan fungera som en giltig stmt värdetyp.

scrollopt

Rullningsalternativ. Parametern scrollopt är int, med standardvärdet NULLoch kan vara ett av följande värden.

Värde Beskrivning
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

På grund av möjligheten att det begärda värdet inte är lämpligt för markören som definieras av stmtfungerar den här parametern både som indata och utdata. I sådana fall tilldelar SQL Server ett lämpligt värde.

ccopt

Alternativ för samtidighetskontroll. ccopt är en valfri parameter som kräver något av följande int indatavärden.

Värde Beskrivning
0x0001 READ_ONLY
0x0002 SCROLL_LOCKS (tidigare känt som LOCKCC)
0x0004 OPTIMISTIC (tidigare känt som OPTCC)
0x0008 OPTIMISTIC (tidigare känt som 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

Precis som med scrolloptkan SQL Server åsidosätta de begärda ccopt- värden.

rowcount

Antalet hämtningsbuffertar som ska användas med AUTO_FETCH. Standardvärdet är 20 rader. rowcount fungerar annorlunda när det tilldelas som ett indatavärde jämfört med ett returvärde.

Som indatavärde Som returvärde
När värdet AUTO_FETCHscrollopt anges representerar radantal antalet rader som ska placeras i hämtningsbufferten.

Obs!> 0 är ett giltigt värde när AUTO_FETCH anges, men ignoreras annars.
Representerar antalet rader i resultatuppsättningen, förutom när värdet scrolloptAUTO_FETCH anges.

boundparam

Betecknar användningen av extra parametrar. boundparam är en valfri parameter som ska anges om värdet scrolloptPARAMETERIZED_STMT anges till ON.

Returnera kodvärden

Om inget fel utlöses returnerar sp_cursoropen något av följande värden.

Värde Beskrivning
0 Proceduren har körts.
0x0001 Ett fel uppstod under körningen (ett mindre fel, inte tillräckligt allvarligt för att skapa ett fel i åtgärden).
0x0002 En asynkron åtgärd pågår.
0x0002 En FETCH åtgärd pågår.
A Markören frigjordes och är inte tillgänglig.

När ett fel utlöses kan returvärdena vara inkonsekventa och noggrannheten kan inte garanteras.

När parametern rowcount anges som ett returvärde inträffar följande resultatuppsättning.

Värde Beskrivning
-1 Returneras om antalet rader är okänt eller inte tillämpligt.
-n Returneras när en asynkron population är i kraft. Representerar antalet rader som placerades i hämtningsbufferten när scrollopt-AUTO_FETCH värde har angetts.

Om RPC används är returvärdena följande.

Värde Beskrivning
0 Proceduren lyckas.
1 Proceduren misslyckades.
2 En tangentuppsättningsmarkör genereras asynkront.
16 En snabbsnabb markören stängdes automatiskt.

Om sp_cursoropen proceduren körs korrekt skickas RPC-returparametrarna och en resultatuppsättning med information om TDS-kolumnformat (0xa0 och 0xa1 meddelanden). Om det misslyckas skickas ett eller flera TDS-felmeddelanden. I båda fallen returneras inga raddata och antalet DONE meddelanden är 0. 0x81 returneras (standard för SELECT-instruktioner) tillsammans med 0xa5- och 0xa4 tokenströmmarna.

Anmärkningar

Parametern stmt

Om stmt anger körningen av en lagrad procedur kan indataparametrarna antingen definieras som konstanter som en del av stmt sträng eller anges som boundparam argument. Deklarerade variabler kan skickas som bundna parametrar på det här sättet.

Det tillåtna innehållet i parametern stmt beror på om ccoptALLOW_DIRECT returnerade värde länkades av OR till resten av ccopt värden:

  • Om ALLOW_DIRECT inte anges måste antingen en Transact-SQL SELECT- eller EXECUTE-instruktion som anropar en lagrad procedur som innehåller en enda SELECT-instruktion användas. Dessutom måste SELECT-instruktionen kvalificeras som en markör. Det kan alltså inte innehålla nyckelorden SELECT INTO eller FOR BROWSE.

  • Om ALLOW_DIRECT anges kan detta resultera i en eller flera Transact-SQL-instruktioner, inklusive instruktioner som kör andra lagrade procedurer med flera instruktioner. Icke-SELECT-instruktioner eller någon SELECT-instruktion som innehåller nyckelorden SELECT INTO eller FOR BROWSE körs och resulterar inte i att en markör skapas. Detsamma gäller för alla SELECT-instruktioner som ingår i en batch med flera instruktioner. I fall där en SELECT-instruktion innehåller satser som endast gäller markörer ignoreras dessa satser. När till exempel värdet för ccopt är 0x2002är detta en begäran för:

    • En markör med rullningslås, om det bara finns en enda SELECT-instruktion som kvalificerar sig som en markör, eller

    • En direkt instruktionskörning om det finns flera instruktioner, en enda icke-SELECT-instruktion eller en SELECT-instruktion som inte kvalificerar sig som en markör.

Parametern scrollopt

De första fem scrollopt-värdena (KEYSEY, DYNAMIC, FORWARD_ONLY, STATICoch FAST_FORWARD) är ömsesidigt uteslutande.

PARAMETERIZED_STMT och CHECK_ACCEPTED_TYPES kan länkas av OR till något av de fem första värdena.

AUTO_FETCH och AUTO_CLOSE kan länkas av OR till FAST_FORWARD.

Om CHECK_ACCEPTED_TYPES är ONmåste minst ett av de fem senaste scrollopt- värdena (KEYSET_ACCEPTABLE, DYNAMIC_ACCEPTABLE, FORWARD_ONLY_ACCEPTABLE, STATIC_ACCEPTABLEeller FAST_FORWARD_ACCEPTABLE) också vara ON.

STATIC markörer öppnas alltid som READ_ONLY. Det innebär att den underliggande tabellen inte kan uppdateras via den här markören.

Parametern ccopt

De första fyra ccopt-värdena (READ_ONLY, SCROLL_LOCKSoch båda OPTIMISTIC värden) utesluts ömsesidigt.

Not

Om du väljer en av de första fyra ccopt-värden avgör om markören är skrivskyddad eller om låsning eller optimistiska metoder används för att förhindra förlorade uppdateringar. Om ett ccopt- värde inte anges är standardvärdet OPTIMISTIC.

ALLOW_DIRECT och CHECK_ACCEPTED_TYPES kan länkas av OR till något av de fyra första värdena.

UPDT_IN_PLACE kan länkas av OR till READ_ONLY, SCROLL_LOCKSeller något av de OPTIMISTIC värdena.

Om CHECK_ACCEPTED_TYPES är ONmåste minst ett av de fyra senaste ccopt-värdena (READ_ONLY_ACCEPTABLE, SCROLL_LOCKS_ACCEPTABLEoch något av de OPTIMISTIC_ACCEPTABLE värdena) också vara PÅ.

Placerade UPDATE- och DELETE-funktioner kan endast utföras i hämtningsbufferten och endast om ccopt-värdet är lika med SCROLL_LOCKS eller OPTIMISTIC. Om SCROLL_LOCKS är det angivna värdet kommer åtgärden garanterat att lyckas. Om OPTIMISTIC är det angivna värdet misslyckas åtgärden om raden har ändrats sedan den senast hämtades.

Orsaken till det här felet är att när OPTIMISTIC är det angivna värdet utförs en optimistisk valutakontrollfunktion genom att jämföra tidsstämplar eller kontrollsummor, enligt SQL Server. Om någon av dessa rader inte matchar misslyckas åtgärden.

Om du anger UPDT_IN_PLACE som returvärde styrs följande resultat:

  • Om den inte anges när du utför en positionerad uppdatering i en tabell med ett unikt index, tar markören bort raden från arbetstabellen och infogar den i slutet av någon av de nyckelkolumner som används av markören, vilket ändrar dessa kolumner.

  • Om du anger ONuppdaterar markören nyckelkolumnerna i arbetstabellens ursprungliga rad.

Parametern bound_param

Parameternamnet ska vara paramdef när PARAMETERIZED_STMT anges, enligt felmeddelandet i koden. När PARAMETERIZED_STMT inte har angetts anges inget namn i felmeddelandet.

RPC-överväganden

RPC-RETURN_METADATA indataflagga kan ställas in på 0x0001 för att begära att markörens valda listmetadata returneras i TDS-strömmen.

Exempel

A. Parametern bound_param

Alla parametrar efter den femte skickas vidare till instruktionsplanen som indataparametrar. Den första parametern måste vara en sträng i följande form:

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

Efterföljande parametrar används för att skicka de värden som ska ersättas med <parameter_name> i -instruktionen.