DECLARE CURSOR (Transact-SQL) (Čeština)

  • 03/14/2017
  • 13 minut ke čtení
    • c
    • r
    • i
    • M
    • m
    • +6

Platí pro: SQL Server (všechny podporované verze ) Azure SQL Database

Definuje atributy kurzoru serveru Transact-SQL, například jeho chování při posouvání a dotaz použitý k sestavení sady výsledků, na které kurzor funguje. DECLARE CURSOR přijímá jak syntaxi založenou na normě ISO, tak syntaxi používající sadu rozšíření Transact-SQL.

Konvence syntaxe Transact-SQL

Syntaxe

Poznámka

Chcete-li zobrazit syntaxi Transact-SQL pro SQL Server 2014 a starší, přečtěte si dokumentaci Předchozí verze .

Argumenty

cursor_name
Je definován název kurzoru serveru Transact-SQL. cursor_name musí odpovídat pravidlům pro identifikátory.

INSENSITIVE
Definuje kurzor, který vytvoří dočasnou kopii dat, která má kurzor použít. Všechny požadavky na kurzor jsou zodpovězeny z této dočasné tabulky v tempdb; proto se úpravy provedené v základních tabulkách neprojeví v datech vrácených načtením provedeným v tomto kurzoru a tento kurzor neumožňuje úpravy. Pokud je použita syntaxe ISO, je-li INSENSITIVE vynechána, potvrzené odstranění a aktualizace provedené v podkladových tabulkách (jakýmkoli uživatelem) se projeví v následujících načteních.

SCROLL
Určuje, že všechny možnosti načítání (FIRST, LAST, PRIOR, NEXT, RELATIVE, ABSOLUTE) jsou k dispozici. Pokud SCROLL není v ISO DECLARE CURSOR specifikován, je odporovaná jediná možnost načítání NEXT . SCROLL nelze určit, pokud je zadán také FAST_FORWARD. Pokud není zadán SCROLL, je k dispozici pouze možnost načtení NEXT a kurzor se změní na FORWARD_ONLY.

select_statement
Je standardní SELECT příkaz, který definuje sadu výsledků kurzoru. Klíčová slova FOR BROWSE a INTO nejsou povolena v rámci select_statement deklarace kurzoru.

SQL Server implicitně převádí kurzor na jiný typ, pokud jsou klauze v select_statement v rozporu s funkcemi požadovaného typu kurzoru.

POUZE PRO ČTENÍ
Zabrání aktualizacím provedeným prostřednictvím tohoto kurzoru. Na kurzor nelze odkazovat v klauzuli WHERE CURRENT OF v prohlášení UPDATE nebo DELETE. Tato možnost přepíše výchozí schopnost kurzoru, který má být aktualizován.

cursor_name
Je definován název kurzoru serveru Transact-SQL. cursor_name musí odpovídat pravidlům pro identifikátory.

LOCAL
Určuje, že rozsah kurzoru je lokální pro dávku, uloženou proceduru nebo trigger, ve kterém byl kurzor vytvořen. Název kurzoru je platný pouze v tomto rozsahu. Na kurzor lze odkazovat pomocí proměnných lokálního kurzoru v dávce, uložené proceduře nebo aktivační proceduře nebo parametru OUTPUT uložené procedury. Parametr OUTPUT slouží k předání místního kurzoru zpět volající dávce, uložené proceduře nebo spouštěči, který může přiřadit parametr proměnné kurzoru, aby odkazoval na kurzor po uložené proceduře končí. Kurzor je implicitně uvolněn, když je ukončena dávka, uložená procedura nebo aktivační událost, pokud nebyl kurzor předán zpět v parametru OUTPUT. Pokud je předán zpět v parametru OUTPUT, dojde k uvolnění kurzoru, když dojde k uvolnění poslední proměnné, která na ni odkazuje, nebo vyprší jeho platnost.

GLOBAL
Určuje, že rozsah kurzoru je globální pro připojení. Na název kurzoru lze odkazovat v jakékoli uložené proceduře nebo dávce provedené připojením. Kurzor je uvolněn pouze implicitně při odpojení.

Poznámka

Pokud ani GLOBAL nebo LOCAL je zadáno, výchozí hodnota je řízena nastavením možnosti výchozí databáze lokálních kurzorů.

FORWARD_ONLY
Určuje, že kurzor se může pohybovat pouze dopředu a posouvat se z první až poslední řádek. FETCH NEXT je jediná podporovaná možnost načtení. Po načtení řádků jsou viditelné všechny příkazy pro vložení, aktualizaci a odstranění provedené aktuálním uživatelem (nebo potvrzené jinými uživateli), které ovlivňují řádky v sadě výsledků.Protože kurzor nelze posunout zpět, změny provedené v řádcích v databázi po načtení řádku nejsou viditelné přes kurzor. Kurzory pouze vpřed jsou ve výchozím nastavení dynamické, což znamená, že všechny změny jsou detekovány při zpracování aktuálního řádku. To poskytuje rychlejší otevření kurzoru a umožňuje výsledkové sadě zobrazit aktualizace provedené v podkladových tabulkách. Zatímco kurzory pouze dopředu nepodporují zpětné posouvání, aplikace se mohou vrátit na začátek sady výsledků zavřením a opětovným otevřením kurzoru. Pokud je zadán FORWARD_ONLY bez STATIC, KEYSET nebo DYNAMIC klíčová slova, kurzor funguje jako dynamický kurzor. Pokud není zadán FORWARD_ONLY ani SCROLL, výchozí je FORWARD_ONLY, pokud klíčová slova STATIC, KEYSET nebo DYNAMIC jsou specifikovány. STATIC, KEYSET a DYNAMIC výchozí kurzory SCROLL. Na rozdíl od databázových rozhraní API, jako jsou ODBC a ADO, je FORWARD_ONLY podporován STATIC, KEYSET, a DYNAMIC Kurzory Transact-SQL.

STATIC
Určuje, že kurzor vždy zobrazí sadu výsledků tak, jak byla při prvním otevření kurzoru, a provede dočasná kopie dat, která má použít kurzor. Všechny požadavky na kurzor jsou zodpovězeny z této dočasné tabulky v tempdb. Proto se vložky, aktualizace a mazání provedená v základních tabulkách neprojeví v datech vrácených načtením provedeným v tomto kurzoru a tento kurzor nezjistí změny provedené v členství, pořadí nebo hodnotách sady výsledků po otevření kurzoru . Statické kurzory mohou detekovat své vlastní aktualizace, mazat a vkládat, i když se to od nich nevyžaduje. Předpokládejme například, že statický kurzor načte řádek a jiná aplikace poté tento řádek aktualizuje. Pokud aplikace znovu načte řádek ze statického kurzoru, hodnoty, které vidí, se nezmění, a to navzdory změnám provedeným jinou aplikací. Jsou podporovány všechny typy posouvání.

KEYSET
Určuje, že členství a pořadí řádků v kurzoru je při otevření kurzoru pevné. Sada klíčů, které jednoznačně identifikují řádky, je zabudována do tabulky v databázi tempdb známé jako sada klíčů. Tento kurzor poskytuje funkce mezi statickým a dynamickým kurzorem v jeho schopnosti detekovat změny. Stejně jako statický kurzor ne vždy detekuje změny členství a pořadí sady výsledků. Stejně jako dynamický kurzor detekuje změny hodnot řádků v sadě výsledků. Kurzory řízené sadou klíčů jsou řízeny sadou jedinečných identifikátorů (klíčů) známých jako sada klíčů. Klíče jsou sestaveny ze sady sloupců, které jednoznačně identifikují řádky ve výsledkové sadě. Sada klíčů je sada hodnot klíčů ze všech řádků vrácených příkazem dotazu. U kurzorů řízených sadou klíčů je klíč vytvořen a uložen pro každý řádek v kurzoru a uložen buď na klientské pracovní stanici nebo na serveru. Při přístupu ke každému řádku se uložený klíč použije k načtení aktuálních datových hodnot ze zdroje dat. V případě kurzoru řízeného sadou klíčů je členství v sadě výsledků zmrazeno, když je sada klíčů plně naplněna. Poté nebudou doplňky nebo aktualizace, které ovlivňují členství, součástí sady výsledků, dokud ji znovu neotevřete. Změny hodnot dat (provedené vlastníkem sady klíčů nebo jinými procesy) jsou viditelné, když uživatel posouvá sadou výsledků:

  • Pokud je řádek odstraněn, pokus o načtení řádku vrátí @@FETCH_STATUS hodnotu -2, protože odstraněný řádek se v sadě výsledků zobrazí jako mezera. Klíč pro řádek existuje v sadě klíčů, ale řádek již v sadě výsledků neexistuje.
  • Vložky vytvořené mimo kurzor (jinými procesy) jsou viditelné pouze v případě, že je kurzor zavřený a znovu otevřený. Vložky vytvořené zevnitř kurzoru jsou viditelné na konci sady výsledků.
  • Aktualizace klíčových hodnot z vnějšku kurzoru připomínají odstranění starého řádku následované vložením nového řádku. Řádek s novými hodnotami není viditelný a pokus o načtení řádku se starými hodnotami vrátí @@FETCH_STATUS hodnotu -2. Nové hodnoty jsou viditelné, pokud se aktualizace provádí pomocí kurzoru zadáním klauzule WHERE CURRENT OF.

Poznámka

Pokud dotaz odkazuje na alespoň jednu tabulku bez jedinečného indexu, kurzor sady klíčů se převede na statický kurzor.

DYNAMICKÝ
Definuje kurzor, který odráží všechny změny dat provedené v řádky v jeho výsledné sadě se posouvají kolem kurzoru a načítají nový záznam, bez ohledu na to, zda ke změnám dochází zevnitř kurzoru nebo jinými uživateli mimo kurzor. Proto jsou všechny příkazy pro vkládání, aktualizaci a mazání provedené všemi uživateli viditelné kurzorem.Hodnoty dat, pořadí a členství řádků se mohou při každém načtení změnit. Možnost ABSOLUTE načítání není podporována dynamickými kurzory. Aktualizace provedené mimo kurzor nejsou viditelné, dokud nejsou potvrzeny (pokud není úroveň izolace transakcí kurzoru nastavena na UNCOMMITTED). Předpokládejme například, že dynamický kurzor načte dva řádky a jinou aplikaci pak aktualizuje jeden z těchto řádků a odstraní druhý. Pokud dynamický kurzor poté načte tyto řádky, nenajde odstraněný řádek, ale zobrazí nové hodnoty pro aktualizovaný řádek.

FAST_FORWARD
Určuje FORWARD_ONLY, READ_ONLY kurzor s povolenou optimalizací výkonu. FAST_FORWARD nelze zadat, pokud je zadán také SCROLL nebo FOR_UPDATE. Tento typ kurzoru neumožňuje úpravy dat zevnitř kurzoru.

Poznámka

Oba FAST_FORWARD a FORWARD_ONLY lze použít ve stejném prohlášení DECLARE CURSOR.

READ_ONLY
Zabrání aktualizacím provedeným prostřednictvím tohoto kurzoru. Na kurzor nelze odkazovat v klauzuli WHERE CURRENT OF v prohlášení UPDATE nebo DELETE. Tato možnost přepíše výchozí schopnost kurzoru, který má být aktualizován.

SCROLL_LOCKS
Určuje, že zaručeně uspějí umístěné aktualizace nebo odstranění provedené kurzorem. SQL Server uzamkne řádky při jejich čtení do kurzoru, aby byla zajištěna jejich dostupnost pro pozdější úpravy. SCROLL_LOCKS nelze určit, pokud je zadán i FAST_FORWARD nebo STATIC.

OPTIMISTICKÉ
Určuje, že umístěné aktualizace nebo odstranění provedené kurzorem nebudou úspěšné, pokud byl řádek aktualizován od jeho načtení do kurzoru. SQL Server nezamyká řádky, protože jsou čteny do kurzoru. Místo toho používá srovnání hodnot sloupce časového razítka nebo hodnoty kontrolního součtu, pokud tabulka nemá sloupec časového razítka, aby určila, zda byl řádek po načtení do kurzoru upraven. Pokud byl řádek změněn, pokus o umístěnou aktualizaci nebo odstranění selže. OPTIMISTIC nelze určit, pokud je zadán i FAST_FORWARD.

TYPE_WARNING
Určuje, že bude odeslána varovná zpráva klientovi, když je kurzor implicitně převeden z požadovaného typu na jiný.

select_statement
Je standardní příkaz SELECT, který definuje sadu výsledků kurzoru. Klíčová slova COMPUTE, COMPUTE BY, FOR BROWSE a INTO nejsou povoleny v select_statement deklaraci kurzoru.

Poznámka

V deklaraci kurzoru můžete použít nápovědu k dotazu; pokud však také používáte klauzuli FOR UPDATE OF, zadejte OPTION (<query_hint>) za FOR UPDATE OF.

SQL Server implicitně převádí kurzor na jiný typ, pokud jsou klauzule v select_statement v rozporu s funkcemi požadovaného typu kurzoru. Další informace najdete v části Implicitní převody kurzoru.

Poznámky

DECLARE CURSOR definuje atributy kurzoru serveru Transact-SQL, například jeho chování při posouvání a dotaz použitý k sestavení sady výsledků, na které kurzor pracuje. Příkaz OPEN naplní sadu výsledků a FETCH vrátí řádek z sady výsledků. Příkaz CLOSE uvolní aktuální sadu výsledků spojenou s kurzorem. Příkaz DEALLOCATE uvolňuje prostředky použité kurzorem.

První forma příkazu DECLARE CURSOR používá ISO syntaxe pro deklaraci chování kurzoru. Druhá forma DECLARE CURSOR používá rozšíření Transact-SQL, která vám umožňují definovat kurzory pomocí stejných typů kurzoru, jaké se používají ve funkcích kurzoru rozhraní API databáze ODBC nebo ADO.

Tyto dvě formy nelze kombinovat. Pokud zadáte klíčová slova SCROLL nebo INSENSITIVE před klíčovým slovem CURSOR, nemůžete použít žádná klíčová slova mezi CURSOR a FOR <select_statement> klíčovými slovy. Pokud mezi klíčová slova CURSOR a FOR <select_statement> zadáte libovolná klíčová slova, nemůžete zadat SCROLL nebo INSENSITIVE před klíčovým slovem CURSOR.

Pokud DECLARE CURSOR používající syntaxi Transact-SQL neurčuje READ_ONLY, OPTIMISTIC nebo SCROLL_LOCKS, výchozí je následující:

  • Pokud SELECT nepodporuje aktualizace (nedostatečná oprávnění, přístup ke vzdáleným tabulkám, které nepodporují aktualizace atd.), kurzor je READ_ONLY.

  • STATIC a FAST_FORWARD výchozí kurzory READ_ONLY.

  • DYNAMIC a KEYSET výchozí kurzory OPTIMISTIC .

Na názvy kurzorů lze odkazovat pouze jinými příkazy Transact-SQL. Nelze na ně odkazovat pomocí funkcí databázového API. Například po deklaraci kurzoru nelze na název kurzoru odkazovat z funkcí nebo metod OLE DB, ODBC nebo ADO. Řádky kurzoru nelze načíst pomocí funkcí načtení nebo metod rozhraní API; řádky lze načíst pouze příkazy FETCH Transact-SQL.

Po deklaraci kurzoru lze tyto systémové uložené procedury použít k určení charakteristik kurzoru.

Systémové uložené procedury Popis
sp_cursor_list Vrátí seznam kurzorů aktuálně viditelných na připojení a jejich atributy.
sp_describe_cursor Popisuje atributy kurzoru, například to, zda se jedná o kurzor pouze vpřed nebo rolování.
sp_describe_cursor_columns Popisuje atributy sloupců v sadě výsledků kurzoru.
sp_describe_cursor_tables Popisuje základní přístupové tabulky kurzorem.

Proměnné lze použít jako součást select_statement, který deklaruje kurzor. Hodnoty proměnných kurzoru se po deklaraci kurzoru nezmění.

Oprávnění

Oprávnění DECLARE CURSOR výchozí pro každého uživatele, který má SELECT oprávnění k pohledům, tabulkám a sloupcům použitým v kurzoru.

Omezení a omezení

U tabulky s seskupený index columnstore. Toto omezení se nevztahuje na nonclustered indexy columnstore; můžete použít kurzory a triggery na tabulce s indexem úložiště sloupců bez seskupení.

Příklady

A. Použití jednoduchého kurzoru a syntaxe

Sada výsledků vygenerovaná při otevření tohoto kurzoru zahrnuje všechny řádky a všechny sloupce v tabulce. Tento kurzor lze aktualizovat a všechny aktualizace a odstranění jsou zastoupeny v načteních provedených proti tomuto kurzoru. FETCH NEXT je jediné dostupné načítání, protože nebyla zadána možnost SCROLL.

B. Použití vnořených kurzorů k vytvoření výstupu sestavy

Následující příklad ukazuje, jak mohou být vnořené kurzory vytvářeny složité sestavy. Vnitřní kurzor je deklarován pro každého dodavatele.

Viz také

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *