- 14/03/2017
- 13 minuter att läsa
-
- c
- r
- i
- M
- m
-
+6
Gäller för: SQL Server (alla versioner som stöds ) Azure SQL Database
Definierar attributen för en Transact-SQL-servermarkör, till exempel dess rullningsbeteende och frågan som används för att bygga resultatuppsättningen på vilken markören fungerar. DECLARE CURSOR
accepterar både en syntax baserad på ISO-standarden och en syntax med en uppsättning Transact-SQL-tillägg.
Transact-SQL-syntaxkonventioner
Syntax
Obs
För att se Transact-SQL-syntax för SQL Server 2014 och tidigare, se dokumentationen för tidigare versioner .
Argument
cursor_name
Är namnet på Transact-SQL-serverns markör definierad. cursor_name måste överensstämma med reglerna för identifierare.
INSENSITIVE
Definierar en markör som gör en tillfällig kopia av de data som markören ska använda. Alla förfrågningar till markören besvaras från denna tillfälliga tabell i tempdb; ändringar som gjorts i bastabellerna återspeglas därför inte i de data som returneras med hämtningar till den här markören, och den här markören tillåter inte ändringar. När ISO-syntax används, om INSENSITIVE
utelämnas, återspeglas engagerade raderingar och uppdateringar av de underliggande tabellerna (av alla användare) i efterföljande hämtningar.
SCROLL
Anger att alla hämtningsalternativ (FIRST
, LAST
, PRIOR
, NEXT
, RELATIVE
, ABSOLUTE
) är tillgängliga. Om SCROLL
inte anges i en ISO DECLARE CURSOR
är NEXT
det enda hämtningsalternativ som stöds . SCROLL
kan inte anges om FAST_FORWARD
också anges. Om SCROLL
inte anges är bara hämtningsalternativet NEXT
tillgängligt och markören blir FORWARD_ONLY
.
select_statement
Är ett standard SELECT
uttalande som definierar markörens resultatuppsättning. Nyckelorden FOR BROWSE
och INTO
är inte tillåtna inom select_statement för en markördeklaration.
SQL Server omvandlar implicit markör till en annan typ om klausuler i select_statement är i konflikt med funktionaliteten för den önskade markörtypen.
LÄS ENDAST
Förhindrar uppdateringar som görs genom denna markör. Markören kan inte hänvisas till i en WHERE CURRENT OF
-sats i ett UPDATE
eller DELETE
-uttalande. Det här alternativet åsidosätter standardfunktionen för en markör som ska uppdateras.
cursor_name
Är namnet på Transact-SQL-servermarkören definierad. cursor_name måste överensstämma med reglerna för identifierare.
LOCAL
Anger att markörens omfång är lokalt för batchen, den lagrade proceduren eller utlösaren där markören skapades. Markörnamnet är endast giltigt inom detta omfång. Markören kan hänvisas till av lokala markörvariabler i batch, lagrad procedur eller trigger, eller en lagrad procedur OUTPUT
-parameter. En OUTPUT
-parameter används för att skicka tillbaka den lokala markören till den anropande satsen, den lagrade proceduren eller utlösaren, som kan tilldela parametern till en markörvariabel för att referera till markören efter den lagrade proceduren avslutas. Markören omplaceras implicit när batchen, den lagrade proceduren eller triggern avslutas, såvida inte markören skickades tillbaka i en OUTPUT
-parameter. Om den skickas tillbaka i en OUTPUT
-parameter, placeras markören när den sista variabeln som hänvisar till den är omlokaliserad eller går utanför räckvidden.
GLOBAL
Anger att markörens omfattning är global för anslutningen. Markörnamnet kan hänvisas till i vilken lagrad procedur eller grupp som helst som körs av anslutningen. Markören delas bara implicit vid avkoppling.
Obs
Om varken GLOBAL
eller LOCAL
specificeras, standardinställningen styrs av inställningen av standardmarkeringsalternativet för lokal markördatabas.
FORWARD_ONLY
Anger att markören bara kan gå framåt och rullas från första till sista raden. FETCH NEXT
är det enda hämtningsalternativ som stöds. Alla infoga, uppdatera och ta bort uttalanden från den aktuella användaren (eller begåtts av andra användare) som påverkar rader i resultatuppsättningen är synliga när raderna hämtas.Eftersom markören inte kan rullas bakåt visas dock inte ändringar som görs i rader i databasen efter att raden hämtats genom markören. Markörer som bara är framåt är dynamiska som standard, vilket innebär att alla ändringar detekteras när den aktuella raden bearbetas. Detta ger snabbare marköröppning och gör det möjligt för resultatuppsättningen att visa uppdateringar gjorda för de underliggande tabellerna. Medan endast framåtmarkörer inte stöder bakåtbläddring kan applikationer återgå till början av resultatuppsättningen genom att stänga och öppna markören igen. Om FORWARD_ONLY
anges utan STATIC
, KEYSET
eller DYNAMIC
nyckelord fungerar markören som en dynamisk markör. När varken FORWARD_ONLY
eller SCROLL
anges, är FORWARD_ONLY
standard, om inte nyckelorden STATIC
, KEYSET
eller DYNAMIC
anges. STATIC
, KEYSET
och DYNAMIC
pekare är SCROLL
. Till skillnad från databas-API: er som ODBC och ADO stöds FORWARD_ONLY
med STATIC
, KEYSET
, och DYNAMIC
Transact-SQL-markörer.
STATIC
Anger att markören alltid visar resultatuppsättningen som den var när markören först öppnades och gör en tillfällig kopia av de data som markören ska använda. Alla förfrågningar till markören besvaras från denna tillfälliga tabell i tempdb. Därför återspeglas inte inlägg, uppdateringar och raderingar i bastabeller i de data som returneras med hämtningar som görs till den här markören, och den här markören upptäcker inte ändringar som gjorts i medlemskapet, ordningen eller värdena för resultatuppsättningen efter att markören har öppnats . Statiska markörer kan upptäcka sina egna uppdateringar, raderingar och inlägg, även om de inte är skyldiga att göra det. Antag till exempel att en statisk markör hämtar en rad, och en annan applikation uppdaterar sedan den raden. Om applikationen hämtar raden från den statiska markören är värdena den oförändrade, trots de ändringar som gjorts av den andra applikationen. Alla typer av rullning stöds.
KEYSET
Anger att medlemskap och ordning på rader i markören är fasta när markören öppnas. Uppsättningen nycklar som unikt identifierar raderna är inbyggd i en tabell i tempdb som kallas tangentuppsättningen. Denna markör ger funktionalitet mellan en statisk och en dynamisk markör i dess förmåga att upptäcka förändringar. Liksom en statisk markör upptäcker det inte alltid ändringar i resultatuppsättningens medlemskap och ordning. Liksom en dynamisk markör upptäcker den ändringar av värdena på rader i resultatuppsättningen. Nyckeldrivna markörer styrs av en uppsättning unika identifierare (nycklar) som kallas tangentuppsättningen. Nycklarna är byggda från en uppsättning kolumner som unikt identifierar raderna i resultatuppsättningen. Nyckeluppsättningen är uppsättningen nyckelvärden från alla rader som returneras av frågesatsen. Med knappsatsdrivna markörer byggs och sparas en nyckel för varje rad i markören och lagras antingen på klientarbetsstationen eller på servern. När du öppnar varje rad används den lagrade nyckeln för att hämta aktuella datavärden från datakällan. I en knappsatsdriven markör fryses resultatuppsättningsmedlemskapet när tangentuppsättningen är fullbefolkad. Därefter är tillägg eller uppdateringar som påverkar medlemskap inte en del av resultatuppsättningen förrän den öppnas igen. Ändringar av datavärden (görs antingen av tangentuppsättningsägaren eller andra processer) är synliga när användaren rullar igenom resultatuppsättningen: >
- Om en rad tas bort returnerar ett försök att hämta raden en
@@FETCH_STATUS
på -2 eftersom den raderade raden visas som ett mellanrum i resultatuppsättningen. Nyckeln för raden finns i tangentuppsättningen, men raden finns inte längre i resultatuppsättningen. - Inlägg som görs utanför markören (av andra processer) är bara synliga om markören är stängd och öppnas igen. Inlägg som görs inifrån markören är synliga i slutet av resultatuppsättningen.
- Uppdateringar av nyckelvärden utanför markören liknar en radering av den gamla raden följt av en infogning av den nya raden. Raden med de nya värdena syns inte, och försök att hämta raden med de gamla värdena returnerar en
@@FETCH_STATUS
av -2. De nya värdena är synliga om uppdateringen görs genom markören genom att angeWHERE CURRENT OF
-satsen.
Anmärkning
Om frågan refererar till minst en tabell utan ett unikt index konverteras tangentuppsättningspekaren till en statisk markör.
DYNAMIC
Definierar en markör som återspeglar alla dataändringar som gjorts i raderna i resultatet ställs in när du rullar runt markören och hämtar en ny post, oavsett om ändringarna sker inifrån markören eller av andra användare utanför markören. Därför är alla infoga, uppdatera och ta bort uttalanden från alla användare synliga genom markören.Datavärdena, ordningen och medlemskapet i raderna kan ändras vid varje hämtning. Alternativet ABSOLUTE
stöds inte med dynamiska markörer. Uppdateringar som görs utanför markören syns inte förrän de begås (såvida inte markörstransaktionens isoleringsnivå är inställd på UNCOMMITTED
). Antag till exempel att en dynamisk markör hämtar två rader och en annan applikation sedan uppdaterar en av dessa rader och tar bort den andra. Om den dynamiska markören sedan hämtar dessa rader hittar den inte den raderade raden, men den visar de nya värdena för den uppdaterade raden.
FAST_FORWARD
Specificerar en FORWARD_ONLY
, READ_ONLY
markör med prestandaoptimeringar aktiverade. FAST_FORWARD
kan inte anges om SCROLL
eller FOR_UPDATE
också anges. Denna typ av markör tillåter inte dataändringar inifrån markören.
Obs
Både FAST_FORWARD
och FORWARD_ONLY
kan användas i samma DECLARE CURSOR
uttalande.
READ_ONLY
Förhindrar uppdateringar som görs genom denna markör. Markören kan inte hänvisas till i en WHERE CURRENT OF
-sats i ett UPDATE
eller DELETE
-uttalande. Det här alternativet åsidosätter standardfunktionen för en markör som ska uppdateras.
SCROLL_LOCKS
Anger att placerade uppdateringar eller raderingar som görs genom markören garanteras lyckas. SQL Server låser raderna när de läses in i markören för att säkerställa att de är tillgängliga för senare ändringar. SCROLL_LOCKS
kan inte anges om FAST_FORWARD
eller STATIC
också anges.
OPTIMISTIC
Anger att placerade uppdateringar eller raderingar som görs genom markören inte lyckas om raden har uppdaterats sedan den lästes in i markören. SQL Server låser inte rader när de läses in i markören. Den använder istället jämförelser av tidsstämpelkolumnvärden eller ett kontrollsumvärde om tabellen inte har någon tidsstämpelkolumn för att avgöra om raden har modifierats efter att den har lästs in i markören. Om raden modifierades misslyckas den försökte placerade uppdateringen eller raderingen. OPTIMISTIC
kan inte anges om FAST_FORWARD
också anges.
TYPE_WARNING
Anger att ett varningsmeddelande skickas till klienten när markören implicit omvandlas från den begärda typen till en annan.
select_statement
Är ett standard SELECT-uttalande som definierar resultatuppsättningen för markören. Nyckelorden COMPUTE
, COMPUTE BY
, FOR BROWSE
och INTO
är inte tillåtna inom select_statement för en markördeklaration.
Obs
Du kan använda en frågetips i en markördeklaration; Om du också använder FOR UPDATE OF
-satsen, anger du OPTION (<query_hint>)
efter FOR UPDATE OF
.
SQL Server omvandlar implicit markören till en annan typ om klausuler i select_statement är i konflikt med funktionaliteten för den önskade markörtypen. Mer information finns i Implicita markörkonverteringar.
Anmärkningar
DECLARE CURSOR
definierar attributen för en Transact-SQL-servermarkör, till exempel dess rullningsbeteende och frågan som används för att bygga den resultatuppsättning som markören fungerar på. Uttrycket OPEN
fyller resultatuppsättningen och FETCH
returnerar en rad från resultatuppsättningen. Uttrycket CLOSE
släpper den aktuella resultatuppsättningen som är associerad med markören. Uttrycket DEALLOCATE
frigör de resurser som används av markören.
Den första formen av DECLARE CURSOR
använder ISO syntax för att deklarera markörbeteenden. Den andra formen av DECLARE CURSOR
använder Transact-SQL-tillägg som låter dig definiera markörer med samma markörtyper som används i databasens API-markörfunktioner för ODBC eller ADO.
Du kan inte blanda de två formerna. Om du anger SCROLL
eller INSENSITIVE
sökord före CURSOR
nyckelordet kan du inte använda något nyckelord mellan CURSOR
och FOR <select_statement>
nyckelord. Om du anger några nyckelord mellan sökorden CURSOR
och FOR <select_statement>
kan du inte ange SCROLL
eller INSENSITIVE
före CURSOR
nyckelordet.
Om en DECLARE CURSOR
som använder Transact-SQL-syntax inte anger READ_ONLY
, OPTIMISTIC
eller SCROLL_LOCKS
, är standardinställningen som följer:
-
Om
SELECT
uttalande stöder inte uppdateringar (otillräckliga behörigheter, åtkomst till fjärrtabeller som inte stöder uppdateringar och så vidare), markören ärREAD_ONLY
. -
STATIC
ochFAST_FORWARD
markörer ärREAD_ONLY
. -
DYNAMIC
ochKEYSET
pekare ärOPTIMISTIC
.
Markörnamn kan endast hänvisas till av andra Transact-SQL-uttalanden. De kan inte refereras till av databas-API-funktioner. Efter att ha tillkännagett en markör kan till exempel inte markörnamnet hänvisas från OLE DB, ODBC eller ADO-funktioner eller metoder. Markörraderna kan inte hämtas med hjälp av hämtningsfunktionerna eller metoderna för API: erna. raderna kan bara hämtas med Transact-SQL FETCH-satser.
Efter att en markör har deklarerats kan dessa systemlagrade procedurer användas för att bestämma markörens egenskaper.
Systemlagrade procedurer | Beskrivning |
---|---|
sp_cursor_list | Returnerar en lista med markörer som för närvarande syns på anslutningen och deras attribut. |
sp_describe_cursor | Beskriver attributen för en markör, till exempel om det är en framåt- eller rullningspekare. |
sp_describe_cursor_column | Beskriver attributen för kolumnerna i markörens resultatuppsättning. |
sp_describe_cursor_tables | Beskriver bastabellerna som du använder av markören. |
Variabler kan användas som en del av select_statementet som deklarerar en markör. Markörvariabelvärden ändras inte efter att en markör har förklarats.
Behörigheter
Behörigheter för DECLARE CURSOR
standard för alla användare som har SELECT
behörigheter för vyer, tabeller och kolumner som används i markören.
Begränsningar och begränsningar
Du kan inte använda markörer eller utlösare i en tabell med ett grupperat kolumnlagerindex. Denna begränsning gäller inte för icke-klusterade kolumnbutikindex; du kan använda markörer och utlösare på en tabell med ett icke-klusterat kolumnlagerindex.
Exempel
A. Använda enkel markör och syntax
Resultatuppsättningen som genererades vid markörens öppning inkluderar alla rader och alla kolumner i tabellen. Denna markör kan uppdateras, och alla uppdateringar och raderingar representeras i hämtningar som görs mot den här markören. FETCH NEXT
är den enda tillgängliga hämtningen eftersom alternativet SCROLL
inte har specificerats.
B. Använda kapslade markörer för att producera rapportutdata
Följande exempel visar hur markörer kan kapslas för att producera komplexa rapporter. Den inre markören deklareras för varje leverantör.