Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
              Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL-databas i Förhandsversion av Microsoft Fabric
Definierar attributen för en Transact-SQL servermarkör, till exempel dess rullningsbeteende och frågan som används för att skapa den resultatuppsättning som markören använder. 
              DECLARE CURSOR accepterar både en syntax som baseras på ISO-standarden och en syntax med hjälp av en uppsättning Transact-SQL tillägg.
              
              
              Transact-SQL syntaxkonventioner
Syntax
ISO syntax:
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
    FOR select_statement
    [ FOR { READ_ONLY | UPDATE [ OF column_name [ , ...n ] ] } ]
[ ; ]
Transact-SQL utökad syntax:
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
    [ FORWARD_ONLY | SCROLL ]
    [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
    [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
    [ TYPE_WARNING ]
    FOR select_statement
    [ FOR UPDATE [ OF column_name [ , ...n ] ] ]
[ ; ]
Arguments
cursor_name
Namnet på Transact-SQL servermarkören har definierats. cursor_name måste följa reglerna för identifierare.
INSENSITIVE
Definierar en markör som gör en tillfällig kopia av data som ska användas av markören. Alla begäranden till markören besvaras från den här temporära tabellen i tempdb. Därför återspeglas inte grundläggande tabelländringar i de data som returneras av hämtningar som gjorts till den här markören, och den här markören tillåter inte ändringar. När ISO-syntax används, om INSENSITIVE den utelämnas, återspeglas incheckade borttagningar och uppdateringar som görs i de underliggande tabellerna (av alla användare) i efterföljande hämtningar.
SCROLL
Anger att alla hämtningsalternativ (FIRST, , LASTPRIOR, NEXT, RELATIVE, ) ABSOLUTEär tillgängliga. Om SCROLL inte anges i en ISO DECLARE CURSORNEXT är det enda hämtningsalternativet som stöds. 
              SCROLL kan inte anges om FAST_FORWARD det också har angetts. Om SCROLL inte anges är endast hämtningsalternativet NEXT tillgängligt och markören blir FORWARD_ONLY.
select_statement
En standardsats SELECT som definierar markörens resultatuppsättning. Nyckelorden och INTO tillåts FOR BROWSEinte inom select_statement för en markördeklaration.
SQL Server konverterar implicit markören till en annan typ om satser i select_statement i konflikt med funktionen för den begärda markörtypen.
READ_ONLY
Förhindrar uppdateringar som görs via den här markören. Det går inte att referera till markören i en WHERE CURRENT OF sats i en UPDATE -instruktion DELETE . Det här alternativet åsidosätter standardfunktionen för en markör som ska uppdateras.
UPPDATERA [ AV column_name [ ,... n ] ]
Definierar uppdateringsbara kolumner i markören. Om OF <column_name> [, <... n> ] anges tillåter endast kolumnerna i listan ändringar. Om UPDATE anges utan en kolumnlista kan alla kolumner uppdateras.
cursor_name
Namnet på Transact-SQL servermarkören har definierats. cursor_name måste följa 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örens namn är endast giltigt inom det här omfånget. Markören kan refereras till av lokala markörvariabler i batchen, lagrad procedur eller utlösare eller en lagrad procedurparameter OUTPUT . En OUTPUT parameter används för att skicka tillbaka den lokala markören till den anropande batchen, den lagrade proceduren eller utlösaren, som kan tilldela parametern till en markörvariabel för att referera till markören när den lagrade proceduren har avslutats. Markören frigörs implicit när batchen, den lagrade proceduren eller utlösaren avslutas, såvida inte markören skickades tillbaka i en OUTPUT parameter. Om den skickas tillbaka i en OUTPUT parameter frigörs markören när den sista variabeln som refererar till den frigörs eller hamnar utanför omfånget.
GLOBAL
Anger att markörens omfång är globalt för anslutningen. Markörens namn kan refereras i valfri lagrad procedur eller batch som körs av anslutningen. Markören frigörs endast implicit vid frånkoppling.
Note
Om inget av GLOBAL dem eller LOCAL anges styrs standardinställningen av standardalternativet för lokal markördatabas .
FORWARD_ONLY
Anger att markören bara kan gå framåt och rullas från den första till sista raden. 
              FETCH NEXT är det enda alternativet för hämtning som stöds. Alla infognings-, uppdaterings- och borttagningsinstruktioner som görs av den aktuella användaren (eller som har bekräftats av andra användare) som påverkar rader i resultatuppsättningen visas när raderna hämtas. Eftersom markören inte kan rullas bakåt visas dock inte ändringar som gjorts i rader i databasen efter att raden hämtades via markören. Framåtriktade markörer är dynamiska som standard, vilket innebär att alla ändringar identifieras 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 som gjorts i de underliggande tabellerna. Framåtriktade markörer stöder inte bakåtrullning, men program kan återgå till början av resultatuppsättningen genom att stänga och öppna markören igen.
Om FORWARD_ONLY anges utan nyckelorden STATIC, KEYSETeller DYNAMIC fungerar markören som en dynamisk markör. När FORWARD_ONLY eller SCROLL inte har angetts FORWARD_ONLY är standardvärdet, såvida inte nyckelorden STATIC, KEYSETeller DYNAMIC anges. 
              STATIC, KEYSET, och DYNAMIC markörer är som standard SCROLL. Till skillnad från databas-API:er som ODBC och ADO FORWARD_ONLY stöds med STATIC, KEYSEToch 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 ska användas av markören. Alla begäranden till markören besvaras från den här temporära tabellen i tempdb. Därför återspeglas inte infogningar, uppdateringar och borttagningar som görs i bastabeller i de data som returneras av hämtningar som gjorts till den här markören, och den här markören identifierar inte ändringar som gjorts i medlemskapet, ordningen eller värdena för resultatuppsättningen när markören har öppnats. Statiska markörer kan identifiera sina egna uppdateringar, borttagningar och infogningar, även om de inte behöver göra det.
Anta till exempel att en statisk markör hämtar en rad, och ett annat program uppdaterar sedan raden. Om programmet reetches raden från den statiska markören, de värden som visas är oförändrade, trots de ändringar som gjorts av det andra programmet. Alla typer av rullning stöds.
KEYSET
Anger att medlemskapet och ordningen på raderna i markören korrigeras när markören öppnas. Den uppsättning nycklar som unikt identifierar raderna är inbyggd i en tabell som tempdb kallas för nyckeluppsättningen. Den här markören innehåller funktioner mellan en statisk och en dynamisk markör i dess förmåga att identifiera ändringar. Precis som en statisk markör identifierar den inte alltid ändringar i medlemskapet och ordningen på resultatuppsättningen. Precis som en dynamisk markör identifierar den ändringar i värdena för rader i resultatuppsättningen.
Tangentuppsättningsdrivna markörer styrs av en uppsättning unika identifierare (nycklar) som kallas nyckeluppsättningen. Nycklarna skapas från en uppsättning kolumner som unikt identifierar raderna i resultatuppsättningen. Nyckeluppsättningen är uppsättningen med nyckelvärden från alla rader som returneras av frågeuttryck. Med tangentuppsättningsdrivna markörer skapas och sparas en nyckel för varje rad i markören och lagras antingen på klientarbetsstationen eller på servern. När du kommer åt varje rad används den lagrade nyckeln för att hämta aktuella datavärden från datakällan. I en nyckeluppsättningsdriven markör fryses medlemskapet i resultatuppsättningen när nyckeluppsättningen är helt ifylld. Därefter är tillägg eller uppdateringar som påverkar medlemskapet inte en del av resultatuppsättningen förrän den öppnas igen.
Ändringar i datavärden (som görs antingen av nyckeluppsättningens ägare eller andra processer) visas när användaren bläddrar igenom resultatuppsättningen:
- Om en rad tas bort returnerar ett försök att hämta raden en - @@FETCH_STATUSav- -2eftersom den borttagna raden visas som ett mellanrum i resultatuppsättningen. Nyckeln för raden finns i nyckeluppsättningen, men raden finns inte längre i resultatuppsättningen.
- Infogningar som görs utanför markören (av andra processer) visas endast om markören stängs och öppnas igen. Infogningar som görs inifrån markören visas i slutet av resultatuppsättningen. 
- Uppdateringar av nyckelvärden utanför markören liknar en borttagning av den gamla raden följt av en infogad ny rad. Raden med de nya värdena visas inte och försök att hämta raden med de gamla värdena returnerar en - @@FETCH_STATUSav- -2. De nya värdena visas om uppdateringen görs via markören genom att- WHERE CURRENT OFange -satsen.
Note
Om frågan refererar till minst en tabell utan ett unikt index konverteras tangentuppsättningsmarkören till en statisk markör.
DYNAMIC
Definierar en markör som återspeglar alla dataändringar som gjorts i raderna i resultatuppsättningen 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 visas alla infognings-, uppdaterings- och borttagningsinstruktioner som görs av alla användare via markören. Datavärdena, ordningen och medlemskapet för raderna kan ändras vid varje hämtning. 
              ABSOLUTE Hämtningsalternativet stöds inte med dynamiska markörer. Uppdateringar som görs utanför markören visas inte förrän de har checkats in (såvida inte markörens transaktionsisoleringsnivå är inställd på UNCOMMITTED).
Anta till exempel att en dynamisk markör hämtar två rader, och ett annat program uppdaterar sedan en av dessa rader och tar bort den andra. Om den dynamiska markören sedan hämtar dessa rader hittar den inte den borttagna raden, men den visar de nya värdena för den uppdaterade raden.
FAST_FORWARD
Anger en FORWARD_ONLY, READ_ONLY -markör med prestandaoptimeringar aktiverade. 
              FAST_FORWARD kan inte anges om SCROLL eller FOR_UPDATE också har angetts. Den här typen av markör tillåter inte dataändringar inifrån markören.
Note
Både FAST_FORWARD och FORWARD_ONLY kan användas i samma DECLARE CURSOR -instruktion.
READ_ONLY
Förhindrar uppdateringar som görs via den här markören. Det går inte att referera till markören i en WHERE CURRENT OF sats i en UPDATE -instruktion DELETE . Det här alternativet åsidosätter standardfunktionen för en markör som ska uppdateras.
SCROLL_LOCKS
Anger att positionerade uppdateringar eller borttagningar som görs via markören garanterat kommer att lyckas. SQL Server låser raderna när de läse 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å har angetts.
OPTIMISTIC
Anger att placerade uppdateringar eller borttagningar som görs via 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 i stället jämförelser av tidsstämpelkolumnvärden , eller ett kontrollsummavärde om tabellen inte har någon tidsstämpelkolumn , för att avgöra om raden ändrades efter att den lästes in i markören.
Om raden har ändrats misslyckas den positionerade uppdateringen eller borttagningen. 
              OPTIMISTIC kan inte anges om FAST_FORWARD det också har angetts.
Om STATIC anges tillsammans med OPTIMISTIC markörens argument konverteras kombinationen av de två implicit till motsvarigheten till kombinationen av användning STATIC och READ_ONLY argument, eller argumenten STATIC och FORWARD_ONLY .
TYPE_WARNING
Anger att ett varningsmeddelande skickas till klienten när markören implicit konverteras från den begärda typen till en annan.
Ingen varning skickas till klienten när kombinationen av OPTIMISTIC och STATIC markörens argument används, och markören konverteras implicit till motsvarande en STATIC READ_ONLY eller STATIC FORWARD_ONLY en markör. Konverteringen till omvandlas till READ_ONLY en FAST_FORWARD och READ_ONLY markören från en klients perspektiv.
select_statement
En standardsats SELECT som definierar markörens resultatuppsättning. Nyckelorden , COMPUTE BY, FOR BROWSEoch INTO tillåts COMPUTEinte inom select_statement för en markördeklaration.
Note
Du kan använda ett frågetips i en markördeklaration. Men om du också använder FOR UPDATE OF -satsen anger du OPTION (<query_hint>) efter FOR UPDATE OF.
SQL Server konverterar implicit markören till en annan typ om satser i select_statement i konflikt med funktionen för den begärda markörtypen.
FÖR UPPDATERING [ AV column_name [ ,... n ] ]
Definierar uppdateringsbara kolumner i markören. Om OF <column_name> [, <... n>] anges tillåter endast kolumnerna i listan ändringar. Om UPDATE anges utan en kolumnlista kan alla kolumner uppdateras, såvida inte samtidighetsalternativet READ_ONLY har angetts.
Remarks
              DECLARE CURSOR definierar attributen för en Transact-SQL servermarkör, till exempel dess rullningsbeteende och frågan som används för att skapa den resultatuppsättning som markören använder. -instruktionen OPEN fyller i resultatuppsättningen och FETCH returnerar en rad från resultatuppsättningen. Instruktionen CLOSE släpper den aktuella resultatuppsättningen som är associerad med markören. Instruktionen DEALLOCATE släpper de resurser som används av markören.
Den första formen av -instruktionen DECLARE CURSOR använder ISO-syntaxen för att deklarera markörbeteenden. Den andra formen av DECLARE CURSOR använder Transact-SQL tillägg som gör att du kan definiera markörer med samma markörtyper som används i databas-API:ets markörfunktioner i ODBC eller ADO.
Du kan inte blanda de två formulären. Om du anger nyckelorden SCROLL eller INSENSITIVE före nyckelordet CURSOR kan du inte använda några nyckelord mellan nyckelorden CURSOR och FOR <select_statement> . Om du anger några nyckelord mellan nyckelorden CURSOR och FOR <select_statement> kan du inte ange SCROLL eller INSENSITIVE före nyckelordet CURSOR .
Om en DECLARE CURSOR användningssyntax för Transact-SQL inte anger READ_ONLY, OPTIMISTICeller SCROLL_LOCKS, är standardvärdet följande:
- Om instruktionen - SELECTinte stöder uppdateringar (otillräckliga behörigheter, åtkomst till fjärrtabeller som inte stöder uppdateringar och så vidare) är- READ_ONLYmarkören .
- STATICoch- FAST_FORWARDmarkörer är som standard- READ_ONLY.
- DYNAMICoch- KEYSETmarkörer är som standard- OPTIMISTIC.
Markörnamn kan bara refereras av andra Transact-SQL-instruktioner. De kan inte refereras till av databas-API-funktioner. När du har deklarerat en markör kan du till exempel inte referera till markörens namn från OLE DB-, ODBC- eller ADO-funktioner eller -metoder. Det går inte att hämta markörraderna med api:ernas hämtningsfunktioner eller metoder. raderna kan bara hämtas av Transact-SQL-instruktioner FETCH .
När en markör har deklarerats kan dessa system lagrade procedurer användas för att fastställa markörens egenskaper.
| Systemlagrade procedurer | Description | 
|---|---|
| sp_cursor_list | Returnerar en lista över markörer som för närvarande visas på anslutningen och deras attribut. | 
| sp_describe_cursor | Beskriver attributen för en markör, till exempel om det är en framåtriktad eller rullningsmarkör. | 
| sp_describe_cursor_columns | Beskriver attributen för kolumnerna i markörens resultatuppsättning. | 
| sp_describe_cursor_tables | Beskriver de bastabeller som används av markören. | 
Variabler kan användas som en del av select_statement som deklarerar en markör. Markörvariabelvärden ändras inte när en markör har deklarerats.
Permissions
              DECLARE CURSOR Standardbehörigheter för alla användare som har SELECT behörighet för vyer, tabeller och kolumner som används i markören.
Limitations
Du kan inte använda markörer eller utlösare i en tabell med ett grupperat kolumnlagringsindex. Den här begränsningen gäller inte för icke-illustrerade kolumnlagringsindex. Du kan använda markörer och utlösare i en tabell med ett icke-grupperat kolumnlagringsindex.
Examples
A. Använd grundläggande markör och syntax
Resultatuppsättningen som genereras vid markörens öppning innehåller alla rader och alla kolumner i tabellen. Markören kan uppdateras och alla uppdateringar och borttagningar 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 angetts.
DECLARE vend_cursor CURSOR
    FOR SELECT * FROM Purchasing.Vendor
OPEN vend_cursor
FETCH NEXT FROM vend_cursor;
B. Använda kapslade markörer för att skapa rapportutdata
I följande exempel visas hur markörer kan kapslas för att skapa komplexa rapporter. Den inre markören deklareras för varje leverantör.
SET NOCOUNT ON;
DECLARE @vendor_id INT, @vendor_name NVARCHAR(50),
    @message VARCHAR(80), @product NVARCHAR(50);
PRINT '-------- Vendor Products Report --------';
DECLARE vendor_cursor CURSOR FOR
SELECT VendorID, Name
FROM Purchasing.Vendor
WHERE PreferredVendorStatus = 1
ORDER BY VendorID;
OPEN vendor_cursor
FETCH NEXT FROM vendor_cursor
INTO @vendor_id, @vendor_name
WHILE @@FETCH_STATUS = 0
BEGIN
    PRINT ' '
    SELECT @message = '----- Products From Vendor: ' +
        @vendor_name
    PRINT @message
    -- Declare an inner cursor based
    -- on vendor_id from the outer cursor.
    DECLARE product_cursor CURSOR FOR
    SELECT v.Name
    FROM Purchasing.ProductVendor pv, Production.Product v
    WHERE pv.ProductID = v.ProductID AND
    pv.VendorID = @vendor_id  -- Variable value from the outer cursor
    OPEN product_cursor
    FETCH NEXT FROM product_cursor INTO @product
    IF @@FETCH_STATUS <> 0
        PRINT '         <<None>>'
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SELECT @message = '         ' + @product
        PRINT @message
        FETCH NEXT FROM product_cursor INTO @product
        END
    CLOSE product_cursor
    DEALLOCATE product_cursor
        -- Get the next vendor.
    FETCH NEXT FROM vendor_cursor
    INTO @vendor_id, @vendor_name
END
CLOSE vendor_cursor;
DEALLOCATE vendor_cursor;