FÖRKLARA CURSOR (Transact-SQL)

  • 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 ange WHERE 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 är READ_ONLY.

  • STATIC och FAST_FORWARD markörer är READ_ONLY.

  • DYNAMIC och KEYSET pekare är OPTIMISTIC .

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.

Se även

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *