Udostępnij za pośrednictwem


Kursory języka Transact-SQL

Transact-SQL kursory są używane głównie w procedurach przechowywanych, wyzwalaczy, a Transact-SQL skrypty, w którym one ułatwić zawartość zestaw wyników dostępne dla innych Transact-SQL instrukcje.

Typowego za pomocą Transact-SQL Jeśli kursor znajduje się w procedura przechowywana lub wyzwalacz jest:

  1. Zadeklarować Transact-SQL zmiennych, które zawierają dane zwrócone przez kursor. Jedną zmienną należy zadeklarować na wynik każdej kolumna.Deklarowania zmiennych, które będą mieć wystarczającą do przechowywania wartości zwracane przez kolumna i z danych wpisz można niejawnie konwertować z typu danych kolumna.

  2. Kojarzenie Transact-SQL kursor w instrukcja SELECT, za pomocą instrukcja DECLARE CURSOR. W instrukcja DECLARE CURSOR określa również właściwości kursora, takie jak nazwa kursora i czy kursor znajduje się tylko do odczytu lub jest tylko przesyłanie dalej.

  3. Za pomocą instrukcja OPEN do wykonywania instrukcja SELECT i wypełnić kursor.

  4. Użycie instrukcja pobrania INTO fizycznej pobierania wierszy, 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.

  5. Po zakończeniu kursor, należy użyć instrukcja CLOSE.Zamykanie kursor zwalnia niektóre zasoby, takie jak zestaw wyników się kursor i jego blokad dla bieżącego wiersza, ale struktura kursor jest nadal dostępne do przetwarzania, jeśli ponownie OPEN instrukcja SQL.Ponieważ kursor jest nadal obecne, użytkownik nie może korzystać nazwa kursora w tym miejscu.Instrukcja DEALLOCATE całkowicie zwalnia wszystkie zasoby przydzielone do kursor, łącznie z nazwą kursor.Po kursor jest przydziałów, należy wygenerować instrukcję DECLARE odbudować kursora.

Monitorowanie aktywności kursorów języka Transact-SQL

Można użyć sp_cursor_list systemu przechowywanej procedury w celu uzyskania listy kursorów widoczny dla bieżącego połączenia, a sp_describe_cursor, sp_describe_cursor_columns, and sp_describe_cursor_tables , aby określić właściwości kursor.

Po otwarciu kursor, funkcja @@ CURSOR_ROWS lub cursor_rows kolumna zwrócony przez sp_cursor_list or sp_describe_cursor wskazuje liczbę wierszy w kursora.

Po każdej instrukcja pobrania @@ FETCH_STATUS zostanie zaktualizowany tak, aby odzwierciedlały stan pobierania ostatniej.Można także uzyskać te informacje stanu z fetch_status kolumn zwracanych przez sp_describe_cursor.@@ FETCH_STATUS raportów warunków, takich jak pobieranie poza pierwszy lub ostatni wiersz kursor.@@ FETCH_STATUS jest globalne połączenia i jest ustawiany przez każdego pobrania na każdy otwarty kursor dla połączenia.Jeśli później trzeba znać stan, należy zapisać @@ FETCH_STATUS w zmienną użytkownika przed wykonaniem innej instrukcja w danym połączeniu.Nawet jeśli następna instrukcja nie może być pobierania, może to być INSERT, UPDATE i DELETE, które wyzwalacz zawierający instrukcje pobrania, które zresetować @@ FETCH_STATUS uruchomieniu.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 zakończeniu pobierania, kursor znajduje się na pobieranych wierszy.Pobranych wierszy jest znany jako bieżący wiersz.Jeśli kursor nie został zadeklarowany jako kursora tylko do odczytu, będzie możliwe wykonać instrukcja UPDATE lub DELETE z WHERE CURRENT OF cursor_name Klauzula zmodyfikować bieżącego wiersza.

Nazwa nadawana Transact-SQL kursor w instrukcja DECLARE CURSOR może mieć zasięg globalny lub lokalny. Nazwy globalne kursor odwołuje się partia, procedura przechowywana lub wykonywania wyzwalacza dla połączenia.Nazwy kursor lokalnego nie może odwoływać się poza partia, procedura przechowywana lub wyzwalacz, w którym jest zadeklarowany jako kursor.Lokalne kursory wyzwalaczy i procedur przechowywanych w związku z tym są chronione przed niezamierzone odwołania poza wyzwalacza lub procedura przechowywana.

Przy użyciu kursor, zmienna

Microsoft SQL Server obsługuje także zmienne cursor Typ danych. Kursor może być skojarzony z kursor 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 AdventureWorks.Person.Contact

SET @MyVariable = MyCursor
GO
/* Use DECLARE @local_variable and SET */
DECLARE @MyVariable CURSOR

SET @MyVariable = CURSOR SCROLL KEYSET FOR
SELECT LastName FROM AdventureWorks.Person.Contact;
DEALLOCATE MyCursor;

Po kursor ma zostać skojarzony z kursor zmiennejkursor zmienna może być używany zamiast nazwy kursora w Transact-SQL instrukcje kursora. Procedura przechowywana parametry wyjściowe mogą być także przypisywane cursor dane należy wpisać i skojarzone z kursor. Dzięki temu procedury przechowywane do udostępnienia lokalnej kursorów w sposób kontrolowany.

Odwoływanie się do języka Transact-SQL kursory

Transact-SQL nazwy kursor i zmienne odwołuje się tylko poprzez Transact-SQL instrukcje; nie może być odwołują się do nich funkcje interfejsu API OLE DB, ODBC i obiektów ADO. Na przykład, jeśli używasz DECLARE CURSOR oraz OPEN Transact-SQL kursor, nie ma możliwości używania ODBC SQLFetch or SQLFetchScroll funkcji pobierania wierszy z Transact-SQL kursor. Aplikacje, które wymagają przetwarzania kursora i korzystają z tych interfejsów API, należy użyć kursor pomocy technicznej, wbudowane w bazie danych interfejsu API Transact-SQL kursory.

Można użyć Transact-SQL kursory w aplikacji za pomocą pobrania i wiązanie każdej z kolumn zwracanych przez pobrania do zmiennej programu. The Transact-SQL FETCH does not support batches, however, so this is the least efficient way to return data to an application.Trwa pobieranie każdego wiersza wymaga roundtrip na serwerze.Jest bardziej efektywne, aby można było korzystać z funkcji kursor, wbudowane w bazie danych interfejsów API, które obsługują partiach pobierania wierszy.

Transact-SQL kursory są bardzo wydajne w procedurach przechowywanych i wyzwalaczy.Dzieje się tak, ponieważ wszystko, co jest skompilowany w plan wykonania jednego na serwerze i nie ma nie ruch sieciowy skojarzony z Pobieranie wierszy.

Kursory języka Transact-SQL i opcje zestaw

W SQL Server, błąd jest wywoływane po wygenerowaniu instrukcja pobrania, w którym nastąpiła zmiana wartości w czasie kursor został otwarty. Ten błąd występuje dla każdego z następujących opcji mających wpływ na plan lub opcje wymagane do widoków indeksowanych i obliczane kolumny.Aby uniknąć błędu, nie należy zmieniać opcje zestaw w czasie, gdy kursor jest otwarty.

Planowane jest wpływającą na opcje

ARITHABORT

NUMERIC_ROUNDABORT

FORCEPLAN

QUOTED_IDENTIFIER

ANSI_NULL_DFLT_ON

ANSI_NULL_DFLT_OFF

ANSI_WARNINGS

ANSI_PADDING

ANSI_NULLS

CONCAT_NULL_YIELDS_NULL

DATEFIRST

DATEFORMAT

JĘZYK

TEXTSIZE

Widoki indeksowane i kolumn obliczanych

ANSI_NULLS

ANSI_PADDING

ANSI_WARNINGS

ARITHABORT (w obszarze zgodności 80 lub niższym)

CONCAT_NULL_YIELDS_NULL

QUOTED_IDENTIFIER

NUMERIC_ROUNDABORT

W SQL Server 2000, zmiany ANSI_NULLS i QUOTED_IDENTIFIER nie podnieść błędu, mimo że były inne.