- 14.03.2017
- 13 minutter å lese
-
- c
- r
- i
- M
- m
-
+6
Gjelder: SQL Server (alle støttede versjoner ) Azure SQL Database
Definerer attributtene til en Transact-SQL server-markør, for eksempel rullingsadferd og spørringen som brukes til å bygge resultatsettet som markøren fungerer. DECLARE CURSOR
godtar både en syntaks basert på ISO-standarden og en syntaks ved hjelp av et sett med Transact-SQL-utvidelser.
Transact-SQL-syntakskonvensjoner
Syntaks
Merk
Hvis du vil se Transact-SQL-syntaks for SQL Server 2014 og tidligere, se dokumentasjon for tidligere versjoner .
Argumenter
cursor_name
Er navnet på Transact-SQL server-markøren definert. cursor_name må være i samsvar med reglene for identifikatorer.
INSENSITIVE
Definerer en markør som lager en midlertidig kopi av dataene som markøren skal bruke. Alle forespørsler til markøren blir besvart fra denne midlertidige tabellen i tempdb; endringer som er gjort i basistabeller reflekteres derfor ikke i dataene som returneres med hentinger til denne markøren, og denne markøren tillater ikke endringer. Når ISO-syntaks brukes, hvis INSENSITIVE
utelates, reflekteres forpliktende slettinger og oppdateringer av de underliggende tabellene (av en hvilken som helst bruker) i påfølgende hentinger.
SCROLL
Angir at alle hentealternativer (FIRST
, LAST
, PRIOR
, NEXT
, RELATIVE
, ABSOLUTE
) er tilgjengelige. Hvis SCROLL
ikke er spesifisert i ISO DECLARE CURSOR
, er NEXT
det eneste hentingsalternativet som støttes . SCROLL
kan ikke spesifiseres hvis FAST_FORWARD
også er spesifisert. Hvis SCROLL
ikke er spesifisert, er bare hentealternativet NEXT
tilgjengelig og markøren blir FORWARD_ONLY
.
select_statement
Er en standard SELECT
uttalelse som definerer resultatsettet til markøren. Nøkkelordene FOR BROWSE
og INTO
er ikke tillatt i select_statement av en markørerklæring.
SQL Server konverterer implisitt markør til en annen type hvis klausuler i select_statement er i konflikt med funksjonaliteten til den valgte markørtypen.
LES KUN
Hindrer oppdateringer som gjøres gjennom denne markøren. Markøren kan ikke refereres til i en WHERE CURRENT OF
-klausul i en UPDATE
eller DELETE
-uttalelse. Dette alternativet overstyrer standardfunksjonen til en markør som skal oppdateres.
cursor_name
Er navnet på Transact-SQL server-markøren definert. cursor_name må være i samsvar med reglene for identifikatorer.
LOCAL
Spesifiserer at markørens omfang er lokalt for batchen, den lagrede prosedyren eller utløseren der markøren ble opprettet. Markørnavnet er bare gyldig innenfor dette omfanget. Markøren kan refereres til av lokale markørvariabler i batch, lagret prosedyre eller trigger, eller en lagret prosedyre OUTPUT
parameter. En OUTPUT
-parameter brukes til å føre den lokale markøren tilbake til den anropende batchen, den lagrede prosedyren eller utløseren, som kan tilordne parameteren til en markørvariabel for å referere til markøren etter den lagrede prosedyren. avsluttes. Markøren blir implisitt deallokalisert når batchen, den lagrede prosedyren eller utløseren avsluttes, med mindre markøren ble sendt tilbake i en OUTPUT
-parameter. Hvis den sendes tilbake i en OUTPUT
-parameter, blir markøren deallokalisert når den siste variabelen som refererer til den er deallocated eller går utenfor omfanget.
GLOBAL
Spesifiserer at markørens omfang er globalt for tilkoblingen. Markøren kan henvises til i en hvilken som helst lagret prosedyre eller batch utført av forbindelsen. Markøren blir bare implisitt distribuert ved frakobling.
Merk
Hvis verken GLOBAL
eller LOCAL
er spesifisert, standard kontrolleres av innstillingen av standardalternativet for lokal markørdatabase.
FORWARD_ONLY
Spesifiserer at markøren bare kan bevege seg fremover og rulles fra første til siste rad. FETCH NEXT
er det eneste støttede hentingsalternativet. Alt sett inn, oppdater og slett uttalelser fra den nåværende brukeren (eller begått av andre brukere) som påvirker rader i resultatsettet, er synlige når radene hentes.Fordi markøren ikke kan rulles bakover, er imidlertid ikke endringer som er gjort i radene i databasen etter at raden ble hentet, ikke synlige gjennom markøren. Fremover-bare markører er dynamiske som standard, noe som betyr at alle endringer oppdages når den nåværende raden behandles. Dette gir raskere markøråpning og gjør det mulig for resultatsettet å vise oppdateringer gjort til de underliggende tabellene. Selv om fremover-bare markører ikke støtter tilbakeføring, kan applikasjoner gå tilbake til begynnelsen av resultatsettet ved å lukke og åpne markøren på nytt. Hvis FORWARD_ONLY
er spesifisert uten STATIC
, KEYSET
eller DYNAMIC
søkeord, fungerer markøren som en dynamisk markør. Når verken FORWARD_ONLY
eller SCROLL
er spesifisert, er FORWARD_ONLY
standard, med mindre nøkkelordene STATIC
, KEYSET
, eller DYNAMIC
er spesifisert. STATIC
, KEYSET
, og DYNAMIC
markører som standard til SCROLL
. I motsetning til database-API-er som ODBC og ADO støttes FORWARD_ONLY
med STATIC
, KEYSET
, og DYNAMIC
Transact-SQL-markører.
STATISK
Angir at markøren alltid viser resultatsettet som det var da markøren ble åpnet, og lager en midlertidig kopi av dataene som skal brukes av markøren. Alle forespørsler til markøren blir besvart fra denne midlertidige tabellen i tempdb. Derfor blir innsatser, oppdateringer og slettinger til basetabeller ikke gjenspeilet i dataene som returneres av hentinger til denne markøren, og denne markøren oppdager ikke endringer som er gjort i medlemskapet, rekkefølgen eller verdiene til resultatet satt etter at markøren er åpnet. . Statiske markører kan oppdage egne oppdateringer, slettinger og innsatser, selv om de ikke er pålagt å gjøre det. Anta for eksempel at en statisk markør henter en rad, og et annet program oppdaterer deretter den raden. Hvis applikasjonen henter raden fra den statiske markøren, er verdiene den ser uendret, til tross for endringene som er gjort av det andre programmet. Alle typer rulling støttes.
KEYSET
Angir at medlemskapet og rekkefølgen på radene i markøren er løst når markøren åpnes. Sett med nøkler som unikt identifiserer radene er innebygd i en tabell i tempdb kjent som nøkkelsettet. Denne markøren gir funksjonalitet mellom en statisk og en dynamisk markør i sin evne til å oppdage endringer. Som en statisk markør oppdager den ikke alltid endringer i medlemskapet og rekkefølgen på resultatsettet. Som en dynamisk markør oppdager den endringer i verdiene til rader i resultatsettet. Håndsettdrevne markører styres av et sett med unike identifikatorer (nøkler) kjent som nøkkel sett. Tastene er bygget fra et sett med kolonner som unikt identifiserer radene i resultatsettet. Tastesettet er settet med nøkkelverdier fra alle radene som returneres av spørresetningen. Med nøkkelsettdrevne markører bygges og lagres en nøkkel for hver rad i markøren og lagres enten på klientarbeidsstasjonen eller på serveren. Når du får tilgang til hver rad, brukes den lagrede nøkkelen til å hente gjeldende dataverdier fra datakilden. I en tastaturdrevet markør blir resultatsettmedlemskapet frosset når tastaturet er fullstendig fylt ut. Deretter er ikke tillegg eller oppdateringer som påvirker medlemskap en del av resultatsettet før det åpnes på nytt. Endringer i dataverdier (laget enten av nøkkelsettinnehaveren eller andre prosesser) er synlige når brukeren blar gjennom resultatsettet:
- Hvis en rad slettes, returnerer et forsøk på å hente raden en
@@FETCH_STATUS
på -2 fordi den slettede raden vises som et gap i resultatsettet. Nøkkelen til raden finnes i nøkkelsettet, men raden eksisterer ikke lenger i resultatsettet. - Innsatser laget utenfor markøren (av andre prosesser) er bare synlige hvis markøren lukkes og åpnes på nytt. Innsatser laget fra innsiden av markøren er synlige på slutten av resultatsettet.
- Oppdateringer av nøkkelverdier utenfor markøren ligner på en sletting av den gamle raden etterfulgt av et innlegg av den nye raden. Raden med de nye verdiene er ikke synlig, og forsøk på å hente raden med de gamle verdiene returnerer en
@@FETCH_STATUS
på -2. De nye verdiene er synlige hvis oppdateringen gjøres gjennom markøren ved å spesifisereWHERE CURRENT OF
-klausulen.
Merk
Hvis spørringen refererer til minst en tabell uten en unik indeks, konverteres nøkkelsettmarkøren til en statisk markør.
DYNAMIC
Definerer en markør som gjenspeiler alle dataendringene som er gjort i radene i resultatet settes når du blar rundt markøren og henter en ny post, uavhengig av om endringene skjer fra innsiden av markøren eller av andre brukere utenfor markøren. Derfor er alle innstillinger, oppdateringer og slettinger fra alle brukere synlige gjennom markøren.Dataverdiene, rekkefølgen og medlemskapet i radene kan endres ved hver henting. ABSOLUTE
hentealternativet støttes ikke med dynamiske markører. Oppdateringer utenfor markøren er ikke synlige før de er begått (med mindre isolasjonsnivået for markørtransaksjonen er satt til UNCOMMITTED
). Anta for eksempel at en dynamisk markør henter to rader og en annen applikasjon oppdaterer en av disse radene og sletter den andre. Hvis den dynamiske markøren deretter henter disse radene, vil den ikke finne den slettede raden, men den vil vise de nye verdiene for den oppdaterte raden.
FAST_FORWARD
Spesifiserer en FORWARD_ONLY
, READ_ONLY
markør med ytelsesoptimalisering aktivert. FAST_FORWARD
kan ikke spesifiseres hvis SCROLL
eller FOR_UPDATE
også er spesifisert. Denne typen markør tillater ikke endringer av data fra markøren.
Merk
Både FAST_FORWARD
og FORWARD_ONLY
kan brukes i samme DECLARE CURSOR
uttalelse.
LES_ONLIG
Forhindrer oppdateringer gjort gjennom denne markøren. Markøren kan ikke refereres til i en WHERE CURRENT OF
-klausul i en UPDATE
eller DELETE
-uttalelse. Dette alternativet overstyrer standardfunksjonen til en markør som skal oppdateres.
SCROLL_LOCKS
Spesifiserer at posisjonerte oppdateringer eller slettinger som er gjort gjennom markøren garantert vil lykkes. SQL Server låser radene når de leses inn i markøren for å sikre tilgjengeligheten for senere endringer. SCROLL_LOCKS
kan ikke spesifiseres hvis FAST_FORWARD
eller STATIC
også er spesifisert.
OPTIMISTISK
Angir at posisjonerte oppdateringer eller slettinger som gjøres gjennom markøren ikke lykkes hvis raden er oppdatert siden den ble lest inn i markøren. SQL Server låser ikke rader når de leses inn i markøren. Den bruker i stedet sammenligninger av tidsstempelkolonneverdier, eller en kontrollsumverdi hvis tabellen ikke har noen tidsstempelkolonne, for å avgjøre om raden ble endret etter at den ble lest inn i markøren. Hvis raden ble endret, mislykkes forsøket på posisjonert oppdatering eller sletting. OPTIMISTIC
kan ikke spesifiseres hvis FAST_FORWARD
også er spesifisert.
TYPE_WARNING
Spesifiserer at en advarsel sendes til klienten når markøren implisitt blir konvertert fra den forespurte typen til en annen.
select_statement
Er en standard SELECT-setning som definerer resultatsettet til markøren. Nøkkelordene COMPUTE
, COMPUTE BY
, FOR BROWSE
og INTO
er ikke tillatt i select_statement av en markørerklæring.
Merk
Du kan bruke et spørretips i en markørerklæring. Men hvis du også bruker FOR UPDATE OF
klausulen, spesifiserer du OPTION (<query_hint>)
etter FOR UPDATE OF
.
SQL Server konverterer implisitt markøren til en annen type hvis klausuler i select_statement er i konflikt med funksjonaliteten til den valgte markørtypen. For mer informasjon, se Implisitte markørkonverteringer.
Merknader
DECLARE CURSOR
definerer attributtene til en Transact-SQL-servermarkør, for eksempel dens rulleoppførsel og spørringen som brukes til å bygge resultatsettet som markøren opererer på. Uttrykket OPEN
fyller resultatsettet, og FETCH
returnerer en rad fra resultatsettet. Uttalelsen CLOSE
frigjør gjeldende resultatsett tilknyttet markøren. Uttrykket DEALLOCATE
frigjør ressursene som brukes av markøren.
Den første formen for DECLARE CURSOR
-utsagnet bruker ISO syntaks for å erklære markøradferd. Den andre formen for DECLARE CURSOR
bruker Transact-SQL-utvidelser som lar deg definere markører ved hjelp av de samme markørtypene som brukes i databasens API-markørfunksjoner til ODBC eller ADO.
Du kan ikke blande de to formene. Hvis du angir SCROLL
eller INSENSITIVE
nøkkelordene før CURSOR
nøkkelordet, kan du ikke bruke noe søkeord mellom CURSOR
og FOR <select_statement>
søkeordene. Hvis du spesifiserer søkeord mellom CURSOR
og FOR <select_statement>
søkeordene, kan du ikke spesifisere SCROLL
eller INSENSITIVE
før CURSOR
nøkkelordet.
Hvis en DECLARE CURSOR
som bruker Transact-SQL-syntaks, ikke angir READ_ONLY
, OPTIMISTIC
, eller SCROLL_LOCKS
, er standard som følger:
-
Hvis
SELECT
uttalelse støtter ikke oppdateringer (utilstrekkelige tillatelser, tilgang til eksterne tabeller som ikke støtter oppdateringer og så videre), markøren erREAD_ONLY
. -
STATIC
ogFAST_FORWARD
peker erREAD_ONLY
. -
DYNAMIC
ogKEYSET
-pekere somOPTIMISTIC
.
Markørnavn kan bare refereres til av andre Transact-SQL-setninger. De kan ikke refereres til av API-funksjoner i databasen. Etter at du for eksempel har erklært en markør, kan ikke navnet på markøren henvises til fra funksjoner eller metoder fra OLE DB, ODBC eller ADO. Markørradene kan ikke hentes ved hjelp av hentingsfunksjonene eller metodene til API-ene. radene kan bare hentes med Transact-SQL FETCH-setninger.
Etter at en markør er deklarert, kan disse systemlagrede prosedyrene brukes til å bestemme markørens egenskaper.
Systemlagrede prosedyrer | Beskrivelse |
---|---|
sp_cursor_list | Returnerer en liste over markører som for øyeblikket er synlige på forbindelsen og deres attributter. |
sp_describe_cursor | Beskriver attributtene til en markør, for eksempel om det er en fremadrettet eller rullende markør. |
sp_describe_cursor_column | Beskriver attributtene til kolonnene i markørresultatsettet. |
sp_describe_cursor_tables | Beskriver basetabellene du får tilgang til av markøren. |
Variabler kan brukes som en del av select_statementet som erklærer en markør. Markørvariabelverdier endres ikke etter at en markør er erklært.
Tillatelser
Tillatelser for DECLARE CURSOR
standard til alle brukere som har SELECT
tillatelser til visningene, tabellene og kolonnene som brukes i markøren.
Begrensninger og begrensninger
Du kan ikke bruke markører eller utløsere på en tabell med en gruppert kolonnelagerindeks. Denne begrensningen gjelder ikke indekser uten kolonnelager; du kan bruke markører og utløsere på en tabell med en ikke-gruppert kolonnelagerindeks.
Eksempler
A. Ved å bruke enkel markør og syntaks
Resultatsettet generert ved åpningen av denne markøren inkluderer alle rader og alle kolonner i tabellen. Denne markøren kan oppdateres, og alle oppdateringer og slettinger er representert i hentinger mot denne markøren. FETCH NEXT
er den eneste tilgjengelige hentingen fordi SCROLL
alternativet ikke er spesifisert.
B. Bruke nestede markører for å produsere rapportutdata
Følgende eksempel viser hvordan markører kan nestes for å produsere komplekse rapporter. Den indre markøren er erklært for hver leverandør.