- 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 klauzuleWHERE 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 jeREAD_ONLY
. -
STATIC
aFAST_FORWARD
výchozí kurzoryREAD_ONLY
. -
DYNAMIC
aKEYSET
výchozí kurzoryOPTIMISTIC
.
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.