Sdílet prostřednictvím


Kurzory (SQL Server)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLDatabáze SQL v Microsoft Fabric

Operace v relační databázi fungují na kompletní sadě řádků. Například sada řádků vrácených příkazem SELECT se skládá ze všech řádků, které splňují podmínky v WHERE klauzuli příkazu. Tato úplná sada řádků vrácených příkazem se označuje jako sada výsledků. Aplikace, zejména interaktivní online aplikace, nemůžou vždy efektivně pracovat s celou sadou výsledků jako jednotkou. Tyto aplikace potřebují mechanismus pro práci s jedním řádkem nebo malým blokem řádků najednou. Kurzory jsou rozšířením sad výsledků, které poskytují tento mechanismus.

Kurzory rozšiřují zpracování výsledků o:

  • Umožňuje umístění na konkrétních řádcích sady výsledků.

  • Načtení jednoho řádku nebo bloku řádků z aktuální pozice v sadě výsledků

  • Podpora úprav dat v řádcích na aktuální pozici v sadě výsledků

  • Podporuje různé úrovně viditelnosti změn, které ostatní uživatelé provedli v datech databáze, prezentovaných v výsledné množině.

  • Poskytování Transact-SQL příkazů ve skriptech, uložených procedurách a aktivuje přístup k datům v sadě výsledků.

Poznámky

V některých scénářích, pokud je v tabulce primární klíč, WHILE lze místo kurzoru použít smyčku, bez nutnosti použití kurzoru a bez režie kurzoru.

Existují však scénáře, kdy kurzory nejsou jen nevyhnutelné, ale skutečně potřebné. V takovém případě platí, že pokud není nutné aktualizovat tabulky na základě kurzoru, použijte firehose kurzory, což znamená rychle dopředu a jen pro čtení kurzory.

Implementace kurzoru

SQL Server podporuje tři implementace kurzoru.

Implementace kurzoru Description
Transact-SQL kurzory Transact-SQL kurzory jsou založené na DECLARE CURSOR syntaxi a používají se hlavně ve Transact-SQL skriptech, uložených procedurách a triggerech. Transact-SQL kurzory jsou implementovány na serveru a jsou spravovány příkazy Transact-SQL odeslané z klienta na server. Můžou být také obsaženy v dávkách, uložených procedurách nebo triggerech.
Kurzory serveru aplikačního programovacího rozhraní (API) Kurzory API podporují funkce kurzoru API v rozhraní OLE DB a ODBC. Kurzory serveru rozhraní API se implementují na serveru. Pokaždé, když klientská aplikace volá funkci kurzoru API, přenese zprostředkovatel OLE DB SQL Server Native Client nebo ovladač ODBC požadavek na server, aby provedl akci s kurzorem na serveru API.
Kurzory klienta Kurzory klienta jsou implementovány interně ovladačem ODBC nativního klienta SQL Serveru a knihovnou DLL, která implementuje rozhraní API ADO. Kurzory klienta se implementují ukládáním všech řádek výsledkové sady do mezipaměti na straně klienta. Pokaždé, když klientská aplikace volá funkci kurzoru rozhraní API, provádí ovladač ODBC SQL Server Native Client nebo knihovna ADO DLL operaci kurzoru na řádcích sady výsledků uložených v mezipaměti na klientovi.

Typ kurzorů

SQL Server podporuje čtyři typy kurzorů.

Kurzory můžou používat tempdb pracovní tabulky. Stejně jako operace agregace nebo řazení, které přetečou, způsobují náklady na vstupně-výstupní operace a představují potenciální výkonnostní úzké místo. STATIC kurzory používají pracovní tabulky od svého vzniku. Další informace najdete v části Pracovní tabulky v průvodci architekturou zpracování dotazů.

Pouze směrem vpřed

Kurzor jen vpřed je určen jako FORWARD_ONLY a READ_ONLY nepodporuje posouvání. Označují se také jako firehose kurzory a podporují pouze načítání řádků sériově od začátku do konce kurzoru. Řádky se z databáze nezískají, dokud se nenačtou. Účinky všech INSERTpříkazů a UPDATEDELETE příkazů provedených aktuálním uživatelem nebo potvrzených jinými uživateli, kteří ovlivňují řádky v sadě výsledků, jsou viditelné, když jsou řádky načteny z kurzoru.

Vzhledem k tomu, že se kurzor nedá posunout dozadu, většina změn řádků v databázi po načtení řádku není viditelná přes kurzor. V případech, kdy je změněna hodnota použitá k určení umístění řádku v sadě výsledků, například aktualizace sloupce pokrytého clusterovaným indexem, je upravená hodnota viditelná kurzorem.

I když modely kurzorů rozhraní API databáze považují kurzor pouze vpřed za odlišný typ kurzoru, SQL Server ne. SQL Server považuje možnost pouze vpřed i posouvání za možnosti, které je možné použít u statických, řízených sad klíčů a dynamických kurzorů. Transact-SQL kurzory podporují statické, řízené klávesovou sadou a dynamické kurzory jen vpřed. Modely kurzorů rozhraní API databáze předpokládají, že statické, řízené podle klíčové sady a dynamické kurzory jsou vždy rolovatelné. Pokud je atribut kurzoru nebo vlastnost databázového rozhraní API nastavena jen pro předávání, SQL Server to implementuje jako dynamický kurzor jen pro předávání.

Statický.

Kompletní sada výsledků statického kurzoru je integrovaná tempdb při otevření kurzoru. Statický kurzor vždy zobrazí sadu výsledků tak, jak byla při otevření kurzoru. Statické kurzory detekují málo nebo žádné změny, ale během posouvání spotřebovávají relativně málo prostředků.

Kurzor neodráží žádné změny provedené v databázi, které mají vliv na členství v sadě výsledků nebo změny hodnot ve sloupcích řádků, které tvoří sadu výsledků. Statický kurzor po otevření kurzoru nezobrazuje nové řádky vložené do databáze, i když odpovídají podmínkám hledání příkazu kurzoru SELECT . Pokud jsou řádky, které tvoří sadu výsledků, aktualizovány jinými uživateli, nezobrazí se nové hodnoty dat ve statickém kurzoru. Statický kurzor zobrazí řádky odstraněné z databáze po otevření kurzoru. Žádné UPDATE, INSERT nebo DELETE operace se neprojeví ve statickém kurzoru (pokud kurzor není zavřený a znovu otevřen), a to ani změny provedené stejným připojením, které kurzor otevřelo.

Poznámka:

Statické kurzory SQL Serveru jsou vždy jen pro čtení.

Vzhledem k tomu, že sada výsledků statického kurzoru je uložená v pracovní tabulce tempdb, velikost řádků v sadě výsledků nemůže překročit maximální velikost řádku pro tabulku SQL Serveru.

Další informace najdete v části Pracovní tabulky v průvodci architekturou zpracování dotazů. Další informace o maximální velikosti řádku naleznete v tématu Maximální specifikace kapacity pro SQL Server.

Transact-SQL používá pro statické kurzory nerozlišující termín. Některá databázová rozhraní API je identifikují jako kurzory snímků .

Sada klíčů

Členství a pořadí řádků v kurzoru řízeném klávesovou sadou jsou při otevření kurzoru pevné. Kurzory řízené sadou klíčů jsou řízeny sadou jedinečných identifikátorů nebo klíčů, které se označují jako sada klíčů. Klíče jsou vytvořeny ze sady sloupců, které jednoznačně identifikují řádky v sadě výsledků. Sada klíčů je sada hodnot klíče ze všech řádků kvalifikovaných pro SELECT příkaz v době otevření kurzoru. Sada klíčů pro kurzor řízený klávesovou sadou je integrovaná při tempdb otevření kurzoru.

Dynamický

Dynamické kurzory jsou opakem statických kurzorů. Dynamické kurzory odrážejí všechny změny řádků v sadě výsledků při posouvání kurzorem. Hodnoty dat, pořadí a členství řádků v sadě výsledků se můžou při každém načtení změnit. Všechny UPDATEpříkazy a INSERTDELETEpříkazy provedené všemi uživateli jsou viditelné kurzorem. Aktualizace se zobrazí okamžitě, pokud se provedou kurzorem pomocí funkce rozhraní API, například SQLSetPos nebo klauzule WHERE CURRENT OF Transact-SQL. Aktualizace provedené mimo kurzor nejsou viditelné, dokud nebudou potvrzeny, pokud není úroveň izolace transakce kurzoru nastavena na čtení nepotvrzené. Další informace o úrovních izolace naleznete v tématu SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

Poznámka:

Dynamické plány kurzoru nikdy nepoužívají prostorové indexy.

Žádost o kurzor

SQL Server podporuje dvě metody pro vyžádání kurzoru:

  • Transact-SQL

    Jazyk Transact-SQL podporuje syntaxi pro použití kurzorů modelovaných za syntaxí kurzoru ISO.

  • Funkce kurzoru rozhraní API (Database Application Programming Interface)

    SQL Server podporuje funkce kurzoru těchto databázových rozhraní API:

    • ADO (datový objekt Microsoft ActiveX)

    • OLE

    • ODBC (Open Database Connectivity)

Aplikace by nikdy neměla kombinovat tyto dvě metody vyžádání kurzoru. Aplikace, která používá rozhraní API k určení chování kurzoru, by neměla provést příkaz Transact-SQL DECLARE CURSOR , který také požádá o Transact-SQL kurzor. Aplikace by se měla spustit DECLARE CURSOR pouze v případě, že nastaví všechny atributy kurzoru rozhraní API zpět na výchozí hodnoty.

Pokud není požadován žádný Transact-SQL ani kurzor rozhraní API, SQL Server ve výchozím nastavení vrátí do aplikace úplnou sadu výsledků, která se označuje jako výchozí sada výsledků.

Proces kurzoru

Transact-SQL kurzory a kurzory rozhraní API mají jinou syntaxi, ale u všech kurzorů SQL Serveru se používá následující obecný proces:

  1. Přidružte kurzor k sadě výsledků příkazu Transact-SQL a definujte vlastnosti kurzoru, například zda lze aktualizovat řádky v kurzoru.

  2. Spuštěním příkazu Transact-SQL naplníte kurzor.

  3. Načtěte řádky v kurzoru, který chcete zobrazit. Operace načtení jednoho řádku nebo jednoho bloku řádků z kurzoru se nazývá načtení. Provádění sekvence načítání pro získání řádků vpřed nebo vzad se nazývá rolování.

  4. Volitelně můžete na řádku v aktuální pozici kurzoru provádět operace úprav (aktualizaci nebo odstranění).

  5. Zavřete kurzor.