ERKLÆRER PENGE (Transact-SQL)

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

  • STATIC og FAST_FORWARD peker er READ_ONLY.

  • DYNAMIC og KEYSET -pekere som OPTIMISTIC .

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.

Se også

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *