Dela via


sp_cursor (Transact-SQL)

gäller för:SQL Server

Begär positionerade uppdateringar. Den här proceduren utför åtgärder på en eller flera rader i en hämtningsbuffert för markören. sp_cursor anropas genom att ange ID = 1 i ett TDS-paket (Tabular Data Stream).

Transact-SQL syntaxkonventioner

Syntax

sp_cursor cursor , optype , rownum , table
    [ , value [ ...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

Markörhandtaget. -markören parametern är intoch kan inte NULL. Den här parametern är det handle värde som genereras av databasmotorn och returneras av sp_cursoropen-proceduren.

optype

En obligatorisk parameter som anger vilken åtgärd markören utför. Parametern optype kräver något av följande värden.

Värde Namn Beskrivning
0X0001 UPDATE Används för att uppdatera en eller flera rader i hämtningsbufferten. Raderna som anges i radnummer är återåtkomst och uppdaterade.
0x0002 DELETE Används för att ta bort en eller flera rader i hämtningsbufferten. Raderna som anges i radnummer nås igen och tas bort.
0X0004 INSERT Infogar data utan att skapa en INSERT-instruktion.
0X0008 REFRESH Används för att fylla på bufferten från underliggande tabeller och kan användas för att uppdatera raden om en uppdatering eller borttagning misslyckas på grund av optimistisk samtidighetskontroll eller efter en UPDATE.
0X10 LOCK Gör att ett uppdateringslås (U) hämtas på sidan som innehåller den angivna raden. Det här låset är kompatibelt med delade lås (S) men inte med exklusiva lås (X) eller andra uppdateringslås. Kan användas för att implementera kortsiktig låsning.
0X20 SETPOSITION Används endast när programmet ska utfärda en efterföljande DELETE- eller UPDATE-instruktion.
0X40 ABSOLUTE Kan bara användas med UPDATE eller DELETE. ABSOLUTE används endast med KEYSET markörer (ignoreras för DYNAMIC markörer) och STATIC markörer kan inte uppdateras.

Obs! Om ABSOLUTE anges på en rad i nyckeluppsättningen som inte har hämtats kan åtgärden misslyckas med samtidighetskontrollen och returresultatet kan inte garanteras.

radnummer

Anger vilka av raderna i hämtningsbufferten som markören arbetar med, uppdaterar eller tar bort. Den här parametern påverkar inte startpunkten för någon RELATIVE, NEXTeller PREVIOUS hämtningsåtgärd, eller några uppdateringar eller borttagningar som utförs med hjälp av sp_cursor.

radnummer är en obligatorisk parameter som anropar ett int indatavärde.

  • 1

    Betyder den första raden i hämtningsbufferten.

  • 2, 3, 4, ...n

    Betyder den andra, tredje och fjärde raden och så vidare.

  • 0

    Anger alla rader i hämtningsbufferten.

Den här parametern är endast giltig för användning med UPDATE, DELETE, REFRESHeller LOCKoptype- värden.

tabell

Tabellnamn som identifierar tabellen som optype gäller för när markördefinitionen omfattar en koppling eller tvetydiga kolumnnamn returneras av värdet parameter. Om ingen specifik tabell har angetts är standardvärdet den första tabellen i FROM-satsen. Parametern tabell är valfri och kräver ett strängindatavärde. Strängen kan anges som valfritt tecken eller Unicode-datatyp eller ett tabellnamn i flera delar.

värde

Används för att infoga eller uppdatera värden. -värdet strängparametern används endast med UPDATE- och INSERToptype- värden. Strängen kan anges som valfritt tecken eller Unicode-datatyp.

Parameternamnen för värde kan tilldelas av användaren.

Returnera kodvärden

0 (lyckades) eller 1 (fel).

Anmärkningar

Parametern optype

Förutom kombinationer av SETPOSITION med UPDATE, DELETE, REFRESHeller LOCK; eller ABSOLUTE med antingen UPDATE eller DELETEutesluter optype värden ömsesidigt.

SET-satsen för UPDATE-värdet skapas från -värdet parametern.

En fördel med att använda värdet INSERT <optype> är att du kan undvika att konvertera icke-teckendata till teckenformat för infogningar. Värdena anges på samma sätt som UPDATE. Om några obligatoriska kolumner inte ingår misslyckas INSERT.

  • Värdet för SETPOSITION påverkar inte startpunkten för någon RELATIVE, NEXTeller PREVIOUS hämtningsåtgärd, och inga uppdateringar eller borttagningar utförs med hjälp av sp_cursor-gränssnittet. Tal som inte anger en rad i hämtningsbufferten resulterar i att positionen anges till 1, utan att något fel returneras. När SETPOSITION har körts gäller positionen tills nästa sp_cursorfetch åtgärd, T-SQL-FETCH åtgärd eller sp_cursorSETPOSITION åtgärd via samma markör. En efterföljande sp_cursorfetch-åtgärd anger markörens position till den första raden i den nya hämtningsbufferten medan andra marköranrop inte påverkar positionens värde. SETPOSITION kan länkas av en OR-sats med REFRESH, UPDATE, DELETEeller LOCK för att ange positionens värde till den senast ändrade raden.

Om en rad i hämtningsbufferten inte anges via parametern radnummer anges positionen till 1, utan att något fel returneras. När positionen har angetts gäller den tills nästa sp_cursorfetch åtgärd, T-SQL-FETCH åtgärd eller sp_cursorSETPOSITION åtgärd utförs på samma markör.

SETPOSITION kan länkas av en OR-sats med REFRESH, UPDATE, DELETEeller LOCK för att ange markörens position till den senast ändrade raden.

Parametern radnummer

Om det anges kan parametern radnummer tolkas som radnumret i nyckeluppsättningen i stället för radnumret i hämtningsbufferten. Användaren ansvarar för att säkerställa att samtidighetskontroll upprätthålls. Det innebär att för SCROLL_LOCKS markörer måste du oberoende upprätthålla ett lås på den angivna raden (vilket kan göras via en transaktion). För OPTIMISTIC markörer måste du tidigare ha hämtat raden för att utföra den här åtgärden.

Parametern tabell

Om det optype- värdet är UPDATE eller INSERT och en fullständig uppdaterings- eller insert-instruktion skickas som värde parameter, ignoreras det värde som anges för tabell.

Not

När det gäller vyer kan endast en tabell som deltar i vyn ändras. Det värdet parameterkolumnnamn måste återspegla kolumnnamnen i vyn, men tabellnamnet kan vara namnet på den underliggande bastabellen (i vilket fall sp_cursor ersätter vynamnet).

Parametern värde

Det finns två alternativ till reglerna för att använda värde enligt ovan i avsnittet Argument:

  1. Du kan använda ett namn som @ har förberetts för namnet på kolumnen i select-list för alla namngivna värde parametrar. En fördel med det här alternativet är att datakonvertering kanske inte behövs.

  2. Använd en parameter för att antingen skicka en fullständig UPDATE- eller INSERT-instruktion eller använda flera parametrar för att skicka delar av en UPDATE- eller INSERT-instruktion, som databasmotorn sedan bygger in i en fullständig instruktion. Exempel finns i avsnittet Exempel senare i den här artikeln.

Exempel

Alternativ värdeparameter använder

För UPPDATERING

När en enskild parameter används kan en UPDATE-instruktion skickas med följande syntax:

[ [ UPDATE <table_name> ] SET ] { <column name> = expression } [ , ...n ]

Om UPDATE <table_name> anges ignoreras alla värden som anges för -tabellen parametern.

När flera parametrar används måste den första parametern vara en sträng i följande formulär:

[ SET ] <column name> = expression [ , ...n ]

Följande parametrar måste vara i form av:

<column name> = expression [ , ...n ]

I det här fallet är den <table_name> i den konstruerade uppdateringssatsen den som antingen anges eller är standardinställningen för den tabell parametern.

För INSERT

När en enskild parameter används kan en INSERT-instruktion skickas med följande syntax:

[ [ INSERT [ INTO ] <table_name> ] VALUES ] ( <expression> [ , ...n ] )

Om INSERT <table_name> anges ignoreras alla värden som anges för -tabellen parametern.

När flera parametrar används måste den första parametern vara en sträng i följande formulär:

[ VALUES ] ( <expression> [ , ...n ] )

De efterföljande parametrarna måste vara i form av expression [ , ...n ], förutom när VALUES angavs, i vilket fall det måste finnas en avslutande ) efter det sista uttrycket. I det här fallet är <table_name> i den konstruerade UPDATE-instruktionen den som antingen anges eller är standardinställningen för den tabell parametern.

Not

Det går att skicka en parameter som en namngiven parameter, till exempel @values. I det här fallet kan inga andra namngivna parametrar användas.