- 03/14/2017
- 13 minutter at læse
-
- c
- r
- i
- M
- m
-
+6
Gælder for: SQL Server (alle understøttede versioner ) Azure SQL Database
Definerer attributterne til en Transact-SQL-servermarkør, såsom dens rulleopførsel og forespørgslen, der bruges til at bygge resultatsættet, hvorpå markøren fungerer. DECLARE CURSOR
accepterer både en syntaks baseret på ISO-standarden og en syntaks ved hjælp af et sæt Transact-SQL-udvidelser.
Transact-SQL-syntakskonventioner
Syntaks
Bemærk
For at se Transact-SQL-syntaks til SQL Server 2014 og tidligere, se dokumentation til tidligere versioner .
Argumenter
cursor_name
Er navnet på Transact-SQL-servermarkøren defineret. cursor_name skal overholde reglerne for identifikatorer.
USENSITIV
Definerer en markør, der fremstiller en midlertidig kopi af de data, der skal bruges af markøren. Alle anmodninger til markøren besvares fra denne midlertidige tabel i tempdb; ændringer, der er foretaget i basistabeller, reflekteres derfor ikke i de data, der returneres ved hentninger til denne markør, og denne markør tillader ikke ændringer. Når ISO-syntaks bruges, hvis INSENSITIVE
udelades, reflekteres forpligtede sletninger og opdateringer til de underliggende tabeller (af enhver bruger) i efterfølgende hentninger.
SCROLL
Angiver, at alle hentemuligheder (FIRST
, LAST
, PRIOR
, NEXT
, RELATIVE
, ABSOLUTE
) er tilgængelige. Hvis SCROLL
ikke er specificeret i en ISO DECLARE CURSOR
, er NEXT
den eneste understøttede hentningsindstilling. . SCROLL
kan ikke angives, hvis FAST_FORWARD
også er angivet. Hvis SCROLL
ikke er angivet, er kun hentningsindstillingen NEXT
tilgængelig, og markøren bliver FORWARD_ONLY
.
select_statement
Er en standard SELECT
sætning, der definerer resultatsættet for markøren. Nøgleordene FOR BROWSE
og INTO
er ikke tilladt inden for select_statement for en markørerklæring.
SQL Server konverterer implicit markør til en anden type, hvis klausuler i select_statement er i konflikt med funktionaliteten for den ønskede markørtype.
LÆS KUN
Forhindrer opdateringer foretaget gennem denne markør. Markøren kan ikke henvises til i en WHERE CURRENT OF
-sætning i en UPDATE
eller DELETE
-erklæring. Denne indstilling tilsidesætter standardfunktionen for en markør, der skal opdateres.
cursor_name
Er navnet på Transact-SQL-servermarkøren defineret. cursor_name skal overholde reglerne for identifikatorer.
LOCAL
Angiver, at markørens rækkevidde er lokalt for den batch, den lagrede procedure eller den trigger, hvor markøren blev oprettet. Markørnavnet er kun gyldigt inden for dette omfang. Markøren kan henvises til ved hjælp af lokale markørvariabler i batch, lagret procedure eller trigger eller en lagret procedure OUTPUT
parameter. En OUTPUT
-parameter bruges til at føre den lokale markør tilbage til den kaldende batch, den lagrede procedure eller triggeren, som kan tildele parameteren til en markørvariabel for at henvise til markøren efter den lagrede procedure ophører. Markøren deles implicit, når batchen, den lagrede procedure eller triggeren afsluttes, medmindre markøren blev sendt tilbage i en OUTPUT
-parameter. Hvis den sendes tilbage i en OUTPUT
-parameter, placeres markøren, når den sidste variabel, der henviser til den, deallokeres eller går uden for omfanget.
GLOBAL
Angiver, at markørens rækkevidde er global i forhold til forbindelsen. Markørnavnet kan henvises til i enhver gemt procedure eller batch, der udføres af forbindelsen. Markøren deles kun implicit ved afbrydelse.
Bemærk
Hvis hverken GLOBAL
eller LOCAL
er specificeret, standardindstillingen styres af indstillingen af standardindstillingen til den lokale markørdatabase.
FORWARD_ONLY
Angiver, at markøren kun kan bevæge sig fremad og rulles fra den første til den sidste række. FETCH NEXT
er den eneste understøttede hentningsindstilling. Alle indsæt, opdater og slet udsagn fra den aktuelle bruger (eller begået af andre brugere), der påvirker rækker i resultatsættet, er synlige, når rækkerne hentes.Da markøren ikke kan rulles baglæns, er ændringer, der er foretaget i rækker i databasen, efter at rækken blev hentet, ikke synlige gennem markøren. Fremadrettede markører er som standard dynamiske, hvilket betyder, at alle ændringer detekteres, når den aktuelle række behandles. Dette giver hurtigere markøråbning og gør det muligt for resultatsættet at vise opdateringer til de underliggende tabeller. Mens kun fremadgående markører ikke understøtter bagudrulning, kan applikationer vende tilbage til begyndelsen af resultatsættet ved at lukke og åbne markøren igen. Hvis FORWARD_ONLY
er angivet uden STATIC
, KEYSET
eller DYNAMIC
nøgleord, fungerer markøren som en dynamisk markør. Når hverken FORWARD_ONLY
eller SCROLL
er angivet, er FORWARD_ONLY
standard, medmindre nøgleordene STATIC
, KEYSET
eller DYNAMIC
er angivet. STATIC
, KEYSET
og DYNAMIC
markører er standard til SCROLL
. I modsætning til database-APIer som ODBC og ADO understøttes FORWARD_ONLY
med STATIC
, KEYSET
, og DYNAMIC
Transact-SQL-markører.
STATIC
Angiver, at markøren altid viser resultatsættet, som det var, da markøren først blev åbnet, og gør en midlertidig kopi af de data, der skal bruges af markøren. Alle anmodninger til markøren besvares fra denne midlertidige tabel i tempdb. Derfor indsættes, opdateringer og sletninger, der er foretaget i basistabeller, reflekteres ikke i de data, der returneres ved hentninger til denne markør, og denne markør registrerer ikke ændringer, der er foretaget i medlemskab, rækkefølge eller værdier for det resultat, der er indstillet, efter markøren er åbnet . Statiske markører kan muligvis registrere deres egne opdateringer, sletninger og indsatser, selvom det ikke er nødvendigt for dem. Antag for eksempel, at en statisk markør henter en række, og en anden applikation opdaterer derefter den række. Hvis applikationen henter rækken fra den statiske markør, er de værdier, den ser, uændrede på trods af de ændringer, som den anden applikation har foretaget. Alle typer rulning understøttes.
KEYSET
Angiver, at medlemskab og rækkefølge for rækker i markøren er fast, når markøren åbnes. Sættet med nøgler, der entydigt identificerer rækkerne, er indbygget i en tabel i tempdb kendt som nøglesættet. Denne markør giver funktionalitet mellem en statisk og en dynamisk markør i dets evne til at opdage ændringer. Som en statisk markør registrerer det ikke altid ændringer i medlemskab og rækkefølge for resultatsættet. Ligesom en dynamisk markør registrerer den ændringer i værdierne for rækker i resultatsættet. Tastaturdrevne markører styres af et sæt unikke identifikatorer (nøgler) kendt som nøglesæt. Tasterne er bygget fra et sæt kolonner, der entydigt identificerer rækkerne i resultatsættet. Nøglesættet er sættet med nøgleværdier fra alle de rækker, der returneres af forespørgselserklæringen. Med nøglesæt-drevne markører bygges og gemmes en nøgle for hver række i markøren og gemmes enten på klientarbejdsstationen eller på serveren. Når du åbner hver række, bruges den gemte nøgle til at hente de aktuelle dataværdier fra datakilden. I en nøglesætdrevet markør fryses resultatsætmedlemskab, når nøglesættet er fuldt udfyldt. Derefter er tilføjelser eller opdateringer, der påvirker medlemskab, ikke en del af resultatsættet, før det genåbnes. Ændringer til dataværdier (foretaget enten af nøglesætets ejer eller andre processer) er synlige, når brugeren ruller gennem resultatsættet:
- Hvis en række slettes, returnerer et forsøg på at hente rækken et
@@FETCH_STATUS
på -2, fordi den slettede række vises som et hul i resultatsættet. Nøglen til rækken findes i nøglesættet, men rækken findes ikke længere i resultatsættet. - Indsatser, der er foretaget uden for markøren (ved andre processer), er kun synlige, hvis markøren lukkes og åbnes igen. Indsatser lavet inde fra markøren er synlige i slutningen af resultatsættet.
- Opdateringer af nøgleværdier uden for markøren ligner en sletning af den gamle række efterfulgt af en indsættelse af den nye række. Rækken med de nye værdier er ikke synlig, og forsøg på at hente rækken med de gamle værdier returnerer en
@@FETCH_STATUS
på -2. De nye værdier er synlige, hvis opdateringen sker gennem markøren ved at angiveWHERE CURRENT OF
-klausulen.
Bemærk
Hvis forespørgslen refererer til mindst en tabel uden et unikt indeks, konverteres nøglesætmarkøren til en statisk markør.
DYNAMIC
Definerer en markør, der afspejler alle dataændringer foretaget i rækkerne i dets resultat indstilles, når du ruller rundt om markøren og henter en ny post, uanset om ændringerne sker inde fra markøren eller af andre brugere uden for markøren. Derfor er alle indsæt, opdater og slet udsagn fra alle brugere synlige gennem markøren.Dataværdierne, rækkefølgen og medlemskabet af rækkerne kan ændres ved hver hentning. Indstillingen ABSOLUTE
understøttes ikke med dynamiske markører. Opdateringer foretaget uden for markøren er ikke synlige, før de begås (medmindre isolationsniveauet for markørtransaktion er indstillet til UNCOMMITTED
). Antag for eksempel, at en dynamisk markør henter to rækker og en anden applikation derefter opdaterer en af disse rækker og sletter den anden. Hvis den dynamiske markør derefter henter disse rækker, finder den ikke den slettede række, men den viser de nye værdier for den opdaterede række.
FAST_FORWARD
Specificerer en FORWARD_ONLY
, READ_ONLY
markør med ydeevneoptimeringer aktiveret. FAST_FORWARD
kan ikke angives, hvis SCROLL
eller FOR_UPDATE
også er angivet. Denne type markør tillader ikke datamodifikationer inde fra markøren.
Bemærk
Både FAST_FORWARD
og FORWARD_ONLY
kan bruges i den samme DECLARE CURSOR
udsagn.
LÆS_ONLIG
Forhindrer opdateringer foretaget gennem denne markør. Markøren kan ikke henvises til i en WHERE CURRENT OF
-sætning i en UPDATE
eller DELETE
-erklæring. Denne indstilling tilsidesætter standardfunktionen for en markør, der skal opdateres.
SCROLL_LOCKS
Angiver, at placerede opdateringer eller sletninger foretaget gennem markøren garanteres at lykkes. SQL Server låser rækkerne, når de læses ind i markøren for at sikre deres tilgængelighed til senere ændringer. SCROLL_LOCKS
kan ikke angives, hvis FAST_FORWARD
eller STATIC
også er angivet.
OPTIMISTISK
Angiver, at placerede opdateringer eller sletninger foretaget gennem markøren ikke lykkes, hvis rækken er opdateret, siden den blev læst ind i markøren. SQL Server låser ikke rækker, da de læses ind i markøren. Den bruger i stedet sammenligninger af tidsstempelkolonneværdier eller en kontrolsumværdi, hvis tabellen ikke har nogen tidsstempelkolonne, for at bestemme, om rækken blev ændret, efter at den blev aflæst i markøren. Hvis rækken blev ændret, mislykkedes den forsøgte placerede opdatering eller sletning. OPTIMISTIC
kan ikke angives, hvis FAST_FORWARD
også er angivet.
TYPE_WARNING
Angiver, at der sendes en advarselsmeddelelse til klienten, når markøren implicit konverteres fra den ønskede type til en anden.
select_statement
Er en standard SELECT-sætning, der definerer resultatsættet for markøren. Nøgleordene COMPUTE
, COMPUTE BY
, FOR BROWSE
og INTO
er ikke tilladt inden for select_statement for en markørerklæring.
Bemærk
Du kan bruge et forespørgselstip i en markørerklæring; dog hvis du også bruger FOR UPDATE OF
-sætningen, skal du angive OPTION (<query_hint>)
efter FOR UPDATE OF
.
SQL Server konverterer implicit markøren til en anden type, hvis klausuler i select_statement er i konflikt med funktionaliteten for den ønskede cursortype. For mere information, se Implicitte markørkonverteringer.
Bemærkninger
DECLARE CURSOR
definerer attributterne for en Transact-SQL-servermarkør, såsom dens rulningsadfærd og forespørgslen, der bruges til at bygge det resultatsæt, som markøren fungerer på. OPEN
sætningen udfylder resultatsættet, og FETCH
returnerer en række fra resultatsættet. CLOSE
udsagnet frigiver det aktuelle resultatsæt tilknyttet markøren. DEALLOCATE
udsagn frigiver de ressourcer, der bruges af markøren.
Den første form for DECLARE CURSOR
sætningen bruger ISO syntaks til erklæring af markøradfærd. Den anden form for DECLARE CURSOR
bruger Transact-SQL-udvidelser, der giver dig mulighed for at definere markører ved hjælp af de samme markørtyper, der bruges i database API-markørfunktionerne i ODBC eller ADO.
Du kan ikke blande de to former. Hvis du angiver SCROLL
eller INSENSITIVE
nøgleordene før CURSOR
nøgleordet, kan du ikke bruge nogen nøgleord mellem CURSOR
og FOR <select_statement>
nøgleordene. Hvis du angiver søgeord mellem nøgleordene CURSOR
og FOR <select_statement>
, kan du ikke angive SCROLL
eller INSENSITIVE
før CURSOR
nøgleordet.
Hvis en DECLARE CURSOR
ved hjælp af Transact-SQL-syntaks ikke angiver READ_ONLY
, OPTIMISTIC
eller SCROLL_LOCKS
, er standard som følger:
-
Hvis
SELECT
statement understøtter ikke opdateringer (utilstrækkelig tilladelse, adgang til eksterne tabeller, der ikke understøtter opdateringer osv.), markøren erREAD_ONLY
. -
STATIC
ogFAST_FORWARD
markører erREAD_ONLY
. -
DYNAMIC
ogKEYSET
markører er standardOPTIMISTIC
.
Markørenavne kan kun henvises til af andre Transact-SQL-sætninger. Der kan ikke henvises til dem ved hjælp af database-API-funktioner. For eksempel, efter at have erklæret en markør, kan der ikke henvises til markørnavnet fra OLE DB, ODBC eller ADO funktioner eller metoder. Markørrækkerne kan ikke hentes ved hjælp af APIernes hentningsfunktioner eller metoder; rækkerne kan kun hentes med Transact-SQL FETCH-udsagn.
Efter at en markør er blevet deklareret, kan disse systemlagrede procedurer bruges til at bestemme markørens karakteristika.
Systemlagrede procedurer | Beskrivelse |
---|---|
sp_cursor_list | Returnerer en liste over markører, der aktuelt er synlige på forbindelsen og deres attributter. |
sp_describe_cursor | Beskriver attributterne for en markør, f.eks. om det er en fremadrettet eller rullende markør. |
sp_describe_cursor_column | Beskriver attributterne for kolonnerne i markørresultatsættet. |
sp_describe_cursor_tables | Beskriver basistabellerne, der er adgang af markøren. |
Variabler kan bruges som en del af select_statementet, der erklærer en markør. Markørvariabelværdier ændres ikke, når en markør er erklæret.
Tilladelser
Tilladelser for DECLARE CURSOR
standard til enhver bruger, der har SELECT
tilladelser til de visninger, tabeller og kolonner, der bruges i markøren.
Begrænsninger og begrænsninger
Du kan ikke bruge markører eller udløsere på en tabel med et grupperet kolonnelagerindeks. Denne begrænsning gælder ikke for ikke-grupperede kolonneopbevaringsindekser; du kan bruge markører og udløsere på en tabel med et ikke-grupperet kolonnelagerindeks.
Eksempler
A. Brug af simpel markør og syntaks
Resultatsættet genereret ved åbningen af denne markør inkluderer alle rækker og alle kolonner i tabellen. Denne markør kan opdateres, og alle opdateringer og sletninger er repræsenteret i hentninger, der foretages mod denne markør. FETCH NEXT
er den eneste tilgængelige hentning, fordi indstillingen SCROLL
ikke er angivet.
B. Brug af indlejrede markører til at producere rapportoutput
Følgende eksempel viser, hvordan markører kan indlejres til at producere komplekse rapporter. Den indre markør erklæres for hver leverandør.