Kursory Transact-SQL
Transact-SQLkursory są używane głównie w procedurach przechowywanych, wyzwalaczy, i Transact-SQL skrypty, w których one dopełnić zawartość zestaw wyników dostępne dla innych Transact-SQL instrukcji.
Typowy proces przy użyciu Transact-SQL kursora w procedura składowana lub wyzwalacz jest:
Zadeklarować Transact-SQL zmiennych, które zawierają dane zwrócone przez kursor.Zadeklarować zmienną jeden dla każdego zestaw wyników kolumna.Deklaruje zmienne być wystarczająco duża, aby przechowywać wartości zwracane przez kolumna i danymi wpisz można niejawnie konwertować z typem danych kolumna.
Skojarzenie Transact-SQL kursor z instrukcja SELECT, używając instrukcja DECLARE kursor.instrukcja DECLARE CURSOR definiuje również cechy kursora, takie jak nazwa kursora i czy kursor jest tylko do odczytu lub tylko do przodu.
Użyj instrukcja otwarte do wykonać instrukcja SELECT i wypełnić kursor.
Użyj instrukcja pobrania do fizycznej pobierania wierszy i dane dla każdej kolumna są przenoszone do określonej zmiennej.Other Transact-SQL statements can then reference those variables to access the fetched data values.Transact-SQL cursors do not support fetching blocks of rows.
Po zakończeniu kursor, należy użyć instrukcja Zamknij.Zamykania kursora zwalnia niektóre zasoby, takie jak zestaw wyników kursor i jego blokad dla bieżącego wiersza struktury kursor jest jednak nadal dostępne do przetwarzania, jeśli ponownie opublikowała instrukcja OPEN.Ponieważ kursor jest nadal obecny, nie można ponownie użyć nazwy kursora na tym etapie.Instrukcja DEALLOCATE całkowicie zwalnia wszystkie zasoby przydzielone do kursor, w tym nazwa kursor.Po dealokowaniu kursor musi wydać instrukcja DECLARE odbudować kursora.
Monitorowanie aktywności kursor Transact-SQL
Można użyć sp_cursor_list systemowa procedura składowana w celu uzyskania listy kursorów widoczne dla bieżącego połączenia i sp_describe_cursor, sp_describe_cursor_columns, i sp_describe_cursor_tables do określania charakterystyk kursor.
Po otwarciu kursor, funkcja @@ CURSOR_ROWS lub cursor_rows kolumna zwrócone przez sp_cursor_list lub sp_describe_cursor wskazuje liczbę wierszy w kursor.
Po każdej instrukcja pobrania @@ FETCH_STATUS jest zaktualizowane stanu ostatniego pobrania.Można także uzyskać te informacje o stanie z fetch_status kolumna zwrócone przez sp_describe_cursor.@@ FETCH_STATUS raporty warunków, takich jak pobieranie poza pierwszego lub ostatniego wiersza w kursor.@@ FETCH_STATUS jest globalne połączenie i zresetować przez każdego pobrania na wszystkie otwarte kursor dla połączenia.Jeśli później trzeba znać stan, należy zapisać @@ FETCH_STATUS w zmiennej użytkownika przed wykonaniem instrukcja innego połączenia.Nawet jeśli następna instrukcja nie może być pobranie, może to być WSTAWIANIA, aktualizacji lub usunięcia, który fires wyzwalacz zawierający instrukcje pobrania, które zresetować @@ FETCH_STATUS.The fetch_status column returned by sp_describe_cursor is specific to the cursor specified and is not affected by FETCH statements that reference other cursors.sp_describe_cursor is, however, affected by FETCH statements that reference the same cursor, so care is still needed in its use.
Po ukończeniu pobierania w pobranych wierszy zostanie umieszczony kursor.Pobranych wierszy jest znany jako bieżący wiersz.Jeśli kursor nie został zadeklarowany jako kursora tylko do odczytu, można wykonać AKTUALIZACJĘ lub usunąć instrukcja z którym aktualnie z cursor_name klauzula zmodyfikować bieżący wiersz.
Nazwa nadana Transact-SQL kursor w instrukcja DECLARE CURSOR mogą być globalny lub lokalny.Nazwy globalne kursor odwołuje się z partia, procedura składowana lub wykonywania wyzwalacza dla połączenia.Nazwy kursor lokalnego nie można odwoływać się poza partia, procedura składowana lub wyzwalacz, w którym zadeklarowano kursor.Lokalne kursory wyzwalaczy i procedura składowanas, dlatego są chronione przed niezamierzoną odwołań poza procedura składowana lub wyzwalacza.
Za pomocą zmiennej kursor
Microsoft SQL Server also supports variables with a cursor data type.Kursor można skojarzonych z kursora zmiennej przez jedną z dwóch metod:
/* Use DECLARE @local_variable, DECLARE CURSOR and SET. */
DECLARE @MyVariable CURSOR;
DECLARE MyCursor CURSOR FOR
SELECT LastName FROM AdventureWorks2008R2.Person.Person;
SET @MyVariable = MyCursor;
GO
/* Use DECLARE @local_variable and SET */
DECLARE @MyVariable CURSOR;
SET @MyVariable = CURSOR SCROLL KEYSET FOR
SELECT LastName FROM AdventureWorks2008R2.Person.Person;
DEALLOCATE MyCursor;
Po kursor został skojarzony kursora zmienną, kursora zmienną można używać zamiast nazwy kursora w Transact-SQL instrukcji kursora.Parametry wyjściowe procedurę przechowywaną można przypisać również cursor Typ danych i skojarzonych z kursor.Dzięki temu procedury przechowywane do udostępnienia lokalnej kursory w sposób kontrolowany.
Odwoływanie się do języka Transact-SQL kursory
Transact-SQLnazwy kursor i zmienne są wywoływane tylko przez Transact-SQL sprawozdania; nie mogą one odwołuje funkcji API OLE DB, ODBC i obiektów ADO.Na przykład, jeśli używasz DECLARE kursor i otwórz Transact-SQL kursor, nie ma możliwości używania ODBC SQLFetch lub SQLFetchScroll funkcji pobierania wierszy z Transact-SQL kursor.Aplikacje, które wymagają przetwarzania kursor i korzystanie z tych interfejsów API powinny korzystać z obsługi kursor, wbudowane w bazie danych API Transact-SQL kursory.
Można użyć Transact-SQL kursory w aplikacji za pomocą pobrania i powiązanie każdego kolumna zwracana przez pobranie programu zmienna. Transact-SQL FETCH nie obsługuje partii, jednak, więc jest to najmniej wydajnym sposobem Zwróć dane do aplikacji.Pobieranie każdego wiersza wymaga roundtrip do serwera.Jest bardziej wydajne funkcja kursor wbudowane interfejsów API obsługuje instancje pobierania wierszy bazy danych.
Transact-SQL kursory są niezwykle wydajne w procedur przechowywanych i wyzwalaczy.Wynika to wszystko jest skompilowany w plan wykonania jednego na serwerze i nie ma żadnych ruch sieciowy skojarzony z pobierania wierszy.
Kursory Transact-SQL i ustaw opcje
W SQL Server, błąd jest wywoływane po wygenerowaniu instrukcja pobrania, w którym jest zmiana wartości jako czas kursor został otwarty.Ten błąd występuje dla dowolnego z następujących opcji wpływających na plan lub opcje wymagane do Widoki indeksowane i kolumny obliczane.Aby uniknąć błędu, nie zmieniaj Ustaw opcje podczas, gdy kursor jest otwarty.
Plan wpływających na opcje |
ARITHABORT NUMERIC_ROUNDABORT FORCEPLAN QUOTED_IDENTIFIER ANSI_NULL_DFLT_ON ANSI_NULL_DFLT_OFF ANSI_WARNINGS SPOWODOWAŁYBY ANSI_NULLS CONCAT_NULL_YIELDS_NULL DATEFIRST FORMAT DATY JĘZYK TEXTSIZE |
Widoki indeksowane i kolumny obliczanej |
ANSI_NULLS SPOWODOWAŁYBY ANSI_WARNINGS ARITHABORT (w obszarze zgodność poziom 80 lub niższy) CONCAT_NULL_YIELDS_NULL QUOTED_IDENTIFIER NUMERIC_ROUNDABORT |
W SQL Server 2000, zmiany ANSI_NULLS i QUOTED_IDENTIFIER nie wniosły błąd, chociaż innych został.