Udostępnij za pośrednictwem


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.

Topic link iconKonwencje składni języka Transact-SQL

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