ERKLÆR CURSOR (Transact-SQL)

  • 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 angive WHERE 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 er READ_ONLY.

  • STATIC og FAST_FORWARD markører er READ_ONLY.

  • DYNAMIC og KEYSET markører er standard OPTIMISTIC .

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.

Se også

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *