DECLARE CURSOR (Transact-SQL)
Określa atrybuty Transact-SQL kursor serwera, takie jak jego zachowanie przewijania i kwerendy używane do konstruowania zestaw wyników, w którym prowadzi działalność kursora. DECLARE kursor akceptuje składnię oparte na standardowych ISO i składnię, za pomocą zestaw Transact-SQL rozszerzenia.
ISO Syntax
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]
[;]
Transact-SQL Extended Syntax
DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]
[;]
Argumenty
cursor_name
Is the name of the Transact-SQL server cursor defined.cursor_name must conform to the rules for identifiers.Aby uzyskać więcej informacji na temat reguł dla identyfikatorów zobacz Za pomocą polecenia identyfikatory jako nazwy obiektów.NIEWRAŻLIWE
Definiuje kursora, która zostanie utworzona tymczasowa kopia danych, które mają być używane przez kursor.Z tej tabela tymczasowa odpowiedzi są wszystkie żądania do kursor tempdb; dlatego zmiany dokonane na podstawie tabel nie są odzwierciedlane w danych zwróconych przez pobiera dokonać tego kursor i tego kursor nie zezwala na zmiany.Gdy używana jest składnia ISO, w przypadku pominięcia INSENSITIVE, usuwa zatwierdzone i aktualizacje wprowadzone do odpowiednich tabel (przez dowolnego użytkownika) są odzwierciedlane w kolejnych pobiera.PRZEWIJANIA
Określa, czy pobierać wszystkie opcje (FIRST, LAST, przed, NEXT, względna, BEZWZGLĘDNA) są dostępne.Jeżeli nie określono SCROLL w ISO DECLARE kursor, NEXT jest to jedyna opcja pobierania obsługiwane.SCROLL nie może być określony, jeżeli określony jest również FAST_FORWARD.select_statement
Jest standardowym instrukcja SELECT, który definiuje zestaw wyników kursor.Słowa kluczowe COMPUTE, COMPUTE BY, FOR BROWSE i na nie są dozwolone w obrębie select_statement deklaracja kursor.SQL Server niejawnie konwertuje kursor na inny typ, gdy klauzul w select_statement są w konflikcie z funkcjonalnością typ żądanego kursora. Aby uzyskać więcej informacji zobacz Using Implicit Cursor Conversions.
W TRYBIE TYLKO DO ODCZYTU
Zapobiega aktualizacji za pośrednictwem tego kursor.Kursor nie może odwoływać się w klauzula WHERE CURRENT OF w instrukcja UPDATE lub DELETE.Ta opcja zastępuje możliwości domyślny kursor do aktualizacji.UPDATE [OF column_name [,...n]]
Definiuje kolumn można aktualizować kursor.If OF column_name [,... n] jest określony, modyfikacji kolumn na liście.Jeśli UPDATE jest określona bez listy kolumn, można zaktualizować wszystkie kolumna.cursor_name
Is the name of the Transact-SQL server cursor defined.cursor_name must conform to the rules for identifiers.Aby uzyskać więcej informacji na temat reguł dla identyfikatorów zobacz Za pomocą polecenia identyfikatory jako nazwy obiektów.LOKALNE
Określa, że zakres kursor jest lokalny do partia, procedura przechowywana lub wyzwalacz, w którym utworzono kursor.Nazwa kursor jest prawidłowa tylko w ramach tego zakres.Kursor można się odwoływać za zmiennych lokalnych kursora w partia, procedura przechowywana, wyzwalacza lub procedura przechowywana parametr OUTPUT.Aby przekazywać kursora lokalnego wywoływania partia, procedura przechowywana lub wyzwalacza, które można przypisać parametr do zmiennej kursora, aby odwołać się kursor po kończy w procedurze przechowywanej służy parametru WYJŚCIOWEGO.Kursor jest niejawnie przydziałów podczas partia, procedura przechowywana lub wyzwalacza kończy, chyba że kursor został przekazany po powrocie do parametru WYJŚCIOWEGO.Jeśli zostanie on przekazany po powrocie do parametru WYJŚCIOWEGO, kursor jest przydziałów podczas ostatniego zmiennej przywołującego ją jest przydziałów lub wykracza poza zakresem.GLOBALNE
Określa, że zakres kursor jest globalny do połączenia.Nazwa kursor można odwoływać się w procedurze przechowywanej lub wsadowym wykonane przez połączenie.Kursor jest tylko niejawnie przydziałów na rozłączenie.Uwaga
Jeśli GLOBAL ani LOCAL jest określony, domyślnie jest określany przez ustawienie Ustawienie domyślne lokalnego kursor opcja bazy danych.W SQL Server w wersja 7.0, ta opcja domyślnie ma wartość FAŁSZ, aby dopasować we wcześniejszych wersjach SQL Server, w wszystkich kursory zostały globalne. Domyślnie ta opcja może ulec zmianie w przyszłych wersjach SQL Server. Aby uzyskać więcej informacji zobacz Setting Database Options.
FORWARD_ONLY
Określa, że kursor może tylko być przewijane od pierwszego do ostatniego wiersza.Pobieranie NEXT jest jedynym obsługiwane opcji pobierania.Jeżeli określono FORWARD_ONLY bez STATYCZNE, zestaw KLUCZY lub DYNAMIC słowa kluczowe, kursor działa jako DYNAMIC kursora.Po określeniu FORWARD_ONLY ani SCROLL FORWARD_ONLY jest ustawieniem domyślnym, o ile nie określono słowa kluczowe STATYCZNE, zestaw KLUCZY lub dynamiczne.STATYCZNY, zestaw KLUCZY i kursorów DYNAMIC domyślnie SCROLL.W przeciwieństwie do interfejsów API, takie jak ODBC i obiektów ADO bazy danych FORWARD_ONLY jest obsługiwane w przypadku STATYCZNEJ, zestaw KLUCZY i dynamiczne Transact-SQL kursory.STATYCZNE
Definiuje kursora, która zostanie utworzona tymczasowa kopia danych, które mają być używane przez kursor.Z tej tabela tymczasowa odpowiedzi są wszystkie żądania do kursor tempdb; dlatego zmiany dokonane na podstawie tabel nie są odzwierciedlane w danych zwróconych przez pobiera dokonać tego kursor i tego kursor nie zezwala na zmiany.ZESTAW KLUCZY
Określa, że członkostwa i kolejność wierszy w kursor są rozwiązywane przy otwieraniu kursor.Zestaw kluczy, które jednoznacznie identyfikują wiersze jest wbudowana w tabela tempdb znany jako Zestaw kluczy.Uwaga
Jeśli kwerenda odwołuje się co najmniej jedną tabela bez indeks unikatowy, kursor zestawu kluczy zostanie przekonwertowany na statyczną kursor.
Zmiany wartości nonkey w podstawowych tabelach dokonanych przez innych użytkowników, albo przez właściciela kursor są widoczne jako właściciel Przewija wokół kursor.Wstawia wprowadzonych przez innych użytkowników nie są widoczne (wstawia nie może być dokonane za pomocą Transact-SQL kursor serwera). Jeśli wiersz zostanie usunięty, próba pobrania wiersza zwraca FETCH_STATUS @@ od -2.Aktualizacje wartości klucz z zewnątrz kursor przypominają usuwania starych wiersza następuje wstawienie nowego wiersza.Wiersz z nowymi wartościami nie jest widoczny, i próby pobrania wierszy z stare wartości powrócić FETCH_STATUS @@ od -2.Nowe wartości są widoczne, jeśli aktualizacji dokonuje się za pomocą kursor określając klauzula WHERE CURRENT OF.
DYNAMICZNE
Definiuje kursor, który odzwierciedla wszystkie zmiany danych wprowadzone w wierszach w jej wyniku ustawione podczas przewijania wokół kursor.Można zmienić wartości danych, zamówienia i członkostwo w wierszach na każdego pobrania.Opcja pobierania BEZWZGLĘDNE nie jest obsługiwana z dynamiczne kursory.FAST_FORWARD
Określa FORWARD_ONLY, kursor TYLKO_DO_ODCZYTU z optymalizacji wydajności włączone.FAST_FORWARD nie może być określone, jeśli SCROLL lub FOR_UPDATE także określona.Uwaga
W SQL Server 2000Opcje kursor FAST_FORWARD i FORWARD_ONLY wzajemnie się wykluczają. Jeśli określone są oba, uruchamiany jest błąd.W SQL Server 2005 a później, oba słowa kluczowe mogą być używane w tej samej instrukcja DECLARE kursor.
READ_ONLY
Zapobiega aktualizacji za pośrednictwem tego kursor.Kursor nie może odwoływać się w klauzula WHERE CURRENT OF w instrukcja UPDATE lub DELETE.Ta opcja zastępuje możliwości domyślny kursor do aktualizacji.SCROLL_LOCKS
Specifies that positioned updates or deletes made through the cursor are guaranteed to succeed.SQL Server locks the rows as they are read into the cursor to ensure their availability for later modifications.SCROLL_LOCKS nie może być określone, jeśli FAST_FORWARD lub statyczna jest także określona.OPTYMISTYCZNY
Specifies that positioned updates or deletes made through the cursor do not succeed if the row has been updated since it was read into the cursor.SQL Server does not lock rows as they are read into the cursor.Zamiast tego używa porównania timestamp wartości kolumna lub wartość suma kontrolna, jeśli nie ma w tabela timestamp kolumna, aby ustalić, czy wiersz był modyfikowany po odczytu do kursor. Jeśli wiersz został zmodyfikowany, próby rozmieszczone zaktualizowane lub usunięte nie powiedzie się.OPTYMISTYCZNA nie można określić, jeśli określony jest również FAST_FORWARD.TYPE_WARNING
Określa, że komunikat ostrzegawczy jest wysyłane do klient, gdy kursor znajduje się niejawnie konwertowane od żądanego typu, do innego.select_statement
Jest standardowym instrukcja SELECT, który definiuje zestaw wyników kursor.Słowa kluczowe COMPUTE, COMPUTE BY, FOR BROWSE i na nie są dozwolone w obrębie select_statement deklaracja kursor.Uwaga
Można użyć kwerendy hint w deklaracja kursor, ale jeśli używasz również klauzulę FOR UPDATE Z, określić OPTION ()query_hint) po FOR UPDATE.
SQL Server niejawnie konwertuje kursor na inny typ, gdy klauzul w select_statementsą w konflikcie z funkcjonalnością typ żądanego kursora. Aby uzyskać więcej informacji zobacz niejawnego Conversions kursor.
FOR UPDATE [OF column_name [,...n]]
Definiuje kolumn można aktualizować kursor.If OF column_name [,...n] is supplied, only the columns listed allow modifications.Jeśli UPDATE jest określona bez listy kolumn, można zaktualizować wszystkie kolumna, o ile nie określono opcji Współbieżność TYLKO_DO_ODCZYTU.
Remarks
DECLARE CURSOR definiuje atrybuty Transact-SQL kursor serwera, takie jak jego zachowanie przewijania i kwerendy używane do konstruowania zestaw wyników, w którym prowadzi działalność kursora. Instrukcja OPEN wypełnia zestaw wyników, a pobranie zwraca wiersz z zestawu wyników.Instrukcja CLOSE zwalnia bieżącego zestaw wyników skojarzonych z kursor.Instrukcja DEALLOCATE zwalnia zasoby używane przez kursor.
Pierwszy formularz w instrukcja DECLARE kursor używana jest składnia ISO celu zgłaszania zachowania kursor.Druga forma DECLARE CURSOR używa Transact-SQL rozszerzenia, które pozwalają zdefiniować kursory używają tego samego typu kursora w bazie danych używane funkcje kursor interfejsu API ODBC lub obiektów ADO.
Nie można mieszać dwóch formularzy.Jeśli określisz SCROLL lub INSENSITIVE słów kluczowych przed słowem kluczowym kursor, nie można używać dowolne słowa kluczowe między kursor i do select_statement słów kluczowych.Jeśli określisz dowolne słowa kluczowe między kursor i do select_statement słowa kluczowe, nie można określić SCROLL lub INSENSITIVE przed słowem kluczowym kursor.
Jeśli przy użyciu DECLARE kursor Transact-SQL Składnia nie określa TYLKO_DO_ODCZYTU, OPTIMISTIC lub SCROLL_LOCKS, wartością domyślną jest w następujący sposób:
Instrukcja SELECT nie obsługuje aktualizacji (niewystarczające uprawnienia dostępu do zdalnego tabel, które nie obsługują aktualizacji i tak dalej), TYLKO_DO_ODCZYTU znajduje się kursor.
STATYCZNY i domyślnie kursory FAST_FORWARD TYLKO_DO_ODCZYTU.
DYNAMIC i domyślnie kursory OPTIMISTIC zestawu KLUCZY.
Można odwoływać się tylko przez inne nazwy kursor Transact-SQL instrukcje. Nie może być odwołują się do nich funkcje interfejsu API bazy danych.Na przykład po deklarowanie kursor, nazwa kursora nie może odwoływać się z funkcjami OLE DB, ODBC lub obiektów ADO lub metody.Wiersze kursor nie mogą być pobierane przy użyciu funkcji Pobranie lub metody interfejsów API, wiersze mogą być pobierane tylko przez Transact-SQL Instrukcje pobierania.
Po kursor został zadeklarowany, tych procedur przechowywanych systemu może służyć do określenia właściwości kursora.
procedury składowane w systemie |
Description |
---|---|
sp_cursor_list |
Zwraca listę kursorów widoczne na połączenie i ich atrybutów. |
sp_describe_cursor |
Opisuje atrybuty kursor, takich jak na to, czy jest on tylko do przodu lub przewijanie kursor. |
sp_describe_cursor_columns |
Opisuje atrybuty kolumn zestaw wyników kursor. |
sp_describe_cursor_tables |
W tym artykule opisano tabel bazowych uzyskują kursor. |
Zmienne mogą być używane jako część select_statement deklaruje, że kursor. Wartości zmiennych kursora nie zmieniają się po kursor został zadeklarowany.W SQL Server wersja 6.5 i starszych, zmienne wartości są odświeżane przy każdym otwarciu kursor.
Uprawnienia
DECLARE kursor uprawnienia domyślne dla każdego użytkownika, które ma uprawnienia SELECT widoków, tabel i kolumn w kursor.
Przykłady
A.Za pomocą prostego kursor i składnia
Zestaw wyników wygenerowany przy otwieraniu tego kursor obejmuje wszystkie wiersze i wszystkie kolumny w tabela.This cursor can be updated, and all updates and deletes are represented in fetches made against this cursor.FETCHNEXT is the only fetch available because the SCROLL option has not been specified.
DECLARE vend_cursor CURSOR
FOR SELECT * FROM Purchasing.Vendor
OPEN vend_cursor
FETCH NEXT FROM vend_cursor
B.Za pomocą zagnieżdżonych kursory do wygenerowania raportu
W poniższym przykładzie pokazano, w jaki sposób można zagnieżdżać kursory do uzyskania złożonych raportów.Wewnętrzne kursor jest zadeklarowany dla każdego dostawcy.
SET NOCOUNT ON
DECLARE @vendor_id int, @vendor_name nvarchar(50),
@message varchar(80), @product nvarchar(50)
PRINT '-------- Vendor Products Report --------'
DECLARE vendor_cursor CURSOR FOR
SELECT VendorID, Name
FROM Purchasing.Vendor
WHERE PreferredVendorStatus = 1
ORDER BY VendorID
OPEN vendor_cursor
FETCH NEXT FROM vendor_cursor
INTO @vendor_id, @vendor_name
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT ' '
SELECT @message = '----- Products From Vendor: ' +
@vendor_name
PRINT @message
-- Declare an inner cursor based
-- on vendor_id from the outer cursor.
DECLARE product_cursor CURSOR FOR
SELECT v.Name
FROM Purchasing.ProductVendor pv, Production.Product v
WHERE pv.ProductID = v.ProductID AND
pv.VendorID = @vendor_id -- Variable value from the outer cursor
OPEN product_cursor
FETCH NEXT FROM product_cursor INTO @product
IF @@FETCH_STATUS <> 0
PRINT ' <<None>>'
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @message = ' ' + @product
PRINT @message
FETCH NEXT FROM product_cursor INTO @product
END
CLOSE product_cursor
DEALLOCATE product_cursor
-- Get the next vendor.
FETCH NEXT FROM vendor_cursor
INTO @vendor_id, @vendor_name
END
CLOSE vendor_cursor
DEALLOCATE vendor_cursor