DECLARE CURSOR (Transact-SQL)

Definiuje atrybuty Transact-SQL serwera kursor, takie jak jego zachowanie przewijania i kwerendy używane do konstruowania zestaw wyników na którym działa kursor .DECLARE CURSOR akceptuje składnię oparte na normie ISO i składni za pomocą zestaw Transact-SQL rozszerzenia.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

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
    Jest to nazwa Transact-SQL serwera kursor zdefiniowany.cursor_namemuszą być zgodne z zasadami identyfikatorów.Aby uzyskać więcej informacji na temat reguł identyfikatory zobacz Używane identyfikatory jako nazwy obiektów.

  • WIELKOŚĆ LITER
    Definiuje tworzy tymczasową kopię danych używane przez kursor kursor .Wszystkie żądania do kursor są odbierane z tabela tymczasowej w tempdb; Dlatego modyfikacje oprzeć tabele nie są odzwierciedlane w danych zwróconych przez pobiera dokonać tego kursori tego kursor nie zezwala na zmiany.ISO składnia jest używana, jeśli INSENSITIVE jest pominięty, są odzwierciedlane aktualizacje wprowadzone do odpowiednich tabel (przez dowolnego użytkownika) i usuwa popełnione w kolejnych pobiera.

  • PRZEWIJANIA
    Określa, czy pobierać wszystkie opcje są dostępne (pierwszy, OSTATNI, przed, dalej, względna, BEZWZGLĘDNA).NASTĘPNIE jest obsługiwana tylko opcja pobrania PRZEWIJANIA nie jest określony w ISO DECLARE CURSOR.PRZEWIJANIA nie może być określony, jeśli określony jest również FAST_FORWARD.

  • select_statement
    Jest standardowym SELECT instrukcja definiująca, zestaw wyników kursor.Słowa kluczowe komputerowe, COMPUTE BY, aby PRZEGLĄDAĆ i INTO nie są dozwolone w ramach select_statement kursor deklaracja.

    SQL Serverniejawnie konwertuje innego typu kursor , gdy klauzul w select_statement konflikt z funkcjami typu żądanego kursor .Aby uzyskać więcej informacji, zobacz Za pomocą konwersje niejawne kursora.

  • TYLKO DO ODCZYTU
    Zapobiega aktualizacji za pośrednictwem tego kursor.kursor nie można odwoływać się w którym BIEŻĄCEJ Z klauzula w aktualizacji lub usunięcia instrukcja.Ta opcja zastępuje możliwości domyślny kursor do aktualizacji.

  • UPDATE [OF column_name**,...n]
    Definiuje kolumn aktualizowalnego kursor.If OF column_name
    ,**...n jest określony tylko do kolumn wymienionych zezwolić na modyfikacje.Jeśli aktualizacja jest określona bez listy kolumna , można zaktualizować wszystkie kolumny.

  • cursor_name
    Jest to nazwa Transact-SQL serwera kursor zdefiniowany.cursor_name muszą być zgodne z zasadami identyfikatorów.Aby uzyskać więcej informacji na temat reguł identyfikatory zobacz Używane identyfikatory jako nazwy obiektów.

  • LOKALNE
    Określa, że zakres kursor lokalnego partia, procedura składowanalub wyzwalacz, w którym utworzono kursor .Nazwa kursor jest prawidłowy tylko wewnątrz tego zakres.kursor można się odwoływać za zmiennych lokalnych kursor partia, procedura składowanawyzwalacz lub parametr wyjściowy procedura składowana .Parametr wyjściowy jest używany, aby przekazywać kursor lokalnego wywoływania partia, procedura składowanalub wyzwalacza można przypisać parametr do zmiennej kursor , aby odwołać kursor po zakończenie procedura składowana .kursor niejawnie dealokowaniu podczas partia, procedura składowanalub wyzwalacza kończy, chyba że kursor został przekazany w parametru WYJŚCIOWEGO.Jeżeli upłynął po powrocie do parametru WYJŚCIOWEGO, kursor jest dealokowane wtedy, kiedy ostatnia zmienna przywołującego ją dealokowaniu lub wykracza poza zakres.

  • GLOBALNE
    Określa, że zakres kursor globalnego połączenia.Nazwa kursor można odwoływać się w jakąkolwiek procedura składowana lub partia wykonane przez połączenie.Tylko niejawnie dealokowaniu kursor na rozłączenie.

    Ostrzeżenie

    Jeśli ani szablon GLOBALNY lub lokalny jest określony, domyślnie jest określany przez ustawienie domyślnego kursorlokalnego opcji bazy danych.W SQL Serverwwersja 7.0, ta opcja domyślnie wartość FALSE, aby dopasować we wcześniejszych wersjach SQL Server, w kursory wszystkie były globalnych.Domyślnie opcja ta może ulec zmianie w przyszłych wersjach SQL Server.Aby uzyskać więcej informacji, zobacz Ustawianie opcji bazy danych.

  • FORWARD_ONLY
    Określa, że kursor może jedynie być przewijane od pierwszego do ostatniego wiersza.FETCH dalej jest jedynym obsługiwanych opcji pobierania.Jeśli FORWARD_ONLY jest określona bez STATYCZNE, zestawu KLUCZY lub DYNAMICZNYCH słowa kluczowe, kursor działa jako DYNAMICZNY kursor.Po określeniu PRZEWIJANIA ani FORWARD_ONLY FORWARD_ONLY jest ustawieniem domyślnym, chyba że określono słów kluczowych STATIC, zestawu KLUCZY lub dynamiczne.STATYCZNE, zestaw KLUCZY i dynamiczne kursory domyślnie PRZEWIJANIA.W przeciwieństwie do bazy danych API, takich jak ODBC i ADO, FORWARD_ONLY jest obsługiwany z STATYCZNE, zestaw KLUCZY i DYNAMICZNYMI Transact-SQL kursory.

  • STATYCZNE
    Definiuje tworzy tymczasową kopię danych używane przez kursor kursor .Wszystkie żądania do kursor są odbierane z tabela tymczasowej w tempdb; Dlatego modyfikacje oprzeć tabele nie są odzwierciedlane w danych zwróconych przez pobiera dokonać tego kursori tego kursor nie zezwala na zmiany.

  • ZESTAW KLUCZY
    Określa, że członkostwa i kolejność wierszy w kursor są ustalone przy otwieraniu kursor .zestaw kluczy, które jednoznacznie identyfikują wiersze jest wbudowane w tabela w tempdb znany jako zestawu kluczy.

    Ostrzeżenie

    Jeśli kwerenda odwołuje się co najmniej jedną tabela bez indeks unikatowy kursor zestawu kluczy jest konwertowany na statyczne kursor.

    Zmiany wartości nonkey w tabelach podstawowych przez właściciela kursor lub popełnionych przez innych użytkowników 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 serwera kursor).Jeśli wiersz zostanie usunięty, próba pobrania wiersza zwraca FETCH_STATUS @@-2.Aktualizacje wartości klucz z zewnątrz kursor przypominają Usuń stare wiersza następuje wstawienie nowego wiersza.Wiersz z nowymi wartościami nie jest widoczny i próby pobrania wierszy z starych wartości zwrotu FETCH_STATUS @@-2.Nowe wartości są widoczne, jeśli aktualizacja jest wykonywane przez kursor określając gdzie bieżący z klauzula.

  • DYNAMICZNE
    Definiuje odzwierciedla wszystkie zmiany danych do wierszy w zestaw wyników przewijania wokół kursorw kursor .Na każdego pobrania można zmienić wartości danych, zamówienia i członkostwa wierszy.Opcja pobierania BEZWZGLĘDNE nie jest obsługiwana z dynamiczne kursory.

  • FAST_FORWARD
    Określa FORWARD_ONLY, TYLKO_DO_ODCZYTU kursor z optymalizacji wydajności włączone.FAST_FORWARD nie może być określony, jeśli PRZEWIJANIA lub FOR_UPDATE także określona.

    Ostrzeżenie

    W SQL Server 2000, FAST_FORWARD i FORWARD_ONLY kursor są wzajemnie wyłączności.Jeśli są określone oba powstaje błąd.W SQL Server 2005 i później, oba słowa kluczowe mogą być używane w tej samej instrukcjaDECLARE CURSOR.

  • TYLKO_DO_ODCZYTU
    Zapobiega aktualizacji za pośrednictwem tego kursor.kursor nie można odwoływać się w którym BIEŻĄCEJ Z klauzula w aktualizacji lub usunięcia instrukcja.Ta opcja zastępuje możliwości domyślny kursor do aktualizacji.

  • SCROLL_LOCKS
    Określa pozycjonowane aktualizacji lub usuwania dokonane za pomocą kursor są gwarantowane powiodła się.SQL Serverblokuje wierszy, gdy są odczytywane w kursor do zapewnienia ich dostępności nowszym zmian.SCROLL_LOCKS nie może być określony, jeśli FAST_FORWARD lub STATYCZNEJ także określona.

  • PRZYPADEK OPTYMISTYCZNY
    Określa, że pozycjonowane aktualizacji lub usuwania dokonane za pomocą kursor nie powiodła się, jeśli wiersz został zaktualizowany, ponieważ została przeczytana do kursor.SQL Servernie blokada wiersze, jak są odczytywane w kursor.Zamiast tego wykorzystuje porównania timestampwartościkolumna lub suma kontrolna wartość, gdy tabela nie ma timestampkolumna, aby ustalić, czy wiersz był modyfikowany po odczytano do kursor. Jeśli wiersz został zmodyfikowany próba aktualizacja pozycjonowana lub usunąć nie powiedzie się.OPTYMISTYCZNA nie może być określony, jeśli określony jest również FAST_FORWARD.

  • TYPE_WARNING
    Określa, że komunikat ostrzegawczy jest wysyłany do klient , gdy kursor znajduje się niejawnie przekonwertować z żądanego typu do drugiego.

  • select_statement
    Jest standardowym SELECT instrukcja definiująca, zestaw wyników kursor.Słowa kluczowe komputerowe, COMPUTE BY, aby PRZEGLĄDAĆ i INTO nie są dozwolone w ramach select_statement kursor deklaracja.

    Ostrzeżenie

    Można użyć wskazówki dotyczącej kwerendy w ramach kursor deklaracja; Jeśli jednak także użyć do aktualizacji z klauzulaokreślić OPCJĘ (query_hint) po FOR UPDATE OF.

    SQL Serverniejawnie konwertuje innego typu kursor , gdy klauzul w select_statementkonflikt z funkcjami typu żądanego kursor .Aby uzyskać więcej informacji zobacz temat konwersje niejawne kursora.

  • FOR UPDATE [OF column_name**,...n]
    Definiuje kolumn aktualizowalnego kursor.If OF column_name
    ,**...n jest dostarczany tylko do kolumn wymienionych zezwolić na modyfikacje.Jeśli aktualizacja jest określona bez lista kolumna można zaktualizować wszystkie kolumny, o ile nie określono opcji współbieżność TYLKO_DO_ODCZYTU.

Uwagi

DECLARE CURSOR definiuje atrybuty Transact-SQL serwera kursor, takie jak jego zachowanie przewijania i kwerendy używane do konstruowania zestaw wyników na którym działa kursor .OPEN instrukcja wypełnia, zestaw wynikówi pobranie zwraca wiersz z zestaw wyników.Zamknij instrukcja zwalnia bieżący zestaw wyników skojarzonego z kursor.DEALLOCATE instrukcja zwalnia zasoby używane przez kursor.

Pierwszy formularz instrukcja DECLARE CURSOR używa składni ISO do deklarowania zachowań kursor .Drugi formularz DECLARE CURSOR korzysta z Transact-SQL rozszerzeń, które pozwalają zdefiniować przy użyciu tego samego typu kursor kursory używane w bazie danych API kursor funkcji ODBC lub ADO.

Nie można mieszać dwóch formularzy.Określ PRZEWIJANIA lub NIEWRAŻLIWE słowa kluczowe przed słowem kluczowym kursora, nie można użyć dowolnego słowa kluczowe między kursor i dla select_statement słowa kluczowe.Jeśli określić dowolne słowa kluczowe między kursor i dla select_statement słowa kluczowe, nie można określić PRZEWIJANIA lub INSENSITIVE przed słowem kluczowym kursora.

Jeśli przy użyciu DECLARE CURSOR Transact-SQL składni nie określono TYLKO_DO_ODCZYTU, OPTIMISTIC lub SCROLL_LOCKS, wartością domyślną jest następująca:

  • Jeśli instrukcja SELECT nie obsługuje aktualizacji (niewystarczające uprawnienia dostępu zdalnego tabel, które nie obsługują aktualizacje i tak dalej), TYLKO_DO_ODCZYTU znajduje się kursor .

  • STATYCZNE i domyślne kursory FAST_FORWARD do TYLKO_DO_ODCZYTU.

  • DYNAMICZNE i domyślnie kursory zestawu KLUCZY OPTIMISTIC.

Kursor nazwy można odwoływać się tylko przez inne Transact-SQL instrukcji.Nie mogą one odwołuje funkcji API bazy danych.Na przykład po deklarowanie kursor, nazwa kursor nie można odwoływać się od funkcji OLE DB, ODBC lub ADO lub metody.Wierszami kursor nie może być pobierane przy użyciu funkcji pobranie lub metody interfejsów API; wiersze mogą być pobierane tylko przez Transact-SQL FETCH sprawozdania.

Po zadeklarował kursor tych procedury składowane w systemie może służyć do określania charakterystyk kursor.

Procedury przechowywane systemu

Opis

sp_cursor_list

Zwraca listę kursory widoczne na połączenie i ich atrybutów.

sp_describe_cursor

Opisuje atrybuty kursor, takie jak czy jest tylko przesyłanie dalej lub przewijanie kursor.

sp_describe_cursor_columns

Opisuje atrybuty kursor zestaw wynikóww kolumnach.

sp_describe_cursor_tables

W tym artykule opisano tabel bazowych dostęp przez kursor.

Zmienne mogą być używane jako część select_statement oświadcza, że kursor.Wartości zmiennych kursor zmienia się po zadeklarowane kursor .W SQL Server wersja 6.5 lub starszej, zmiennej wartości są odświeżane co czas kursor zostaje ponownie otwarta.

Uprawnienia

DECLARE CURSOR uprawnienia domyślne dla każdego użytkownika, który ma uprawnienie SELECT dotyczące widoków, tabel i kolumn używanych w kursor.

Przykłady

A.Za pomocą prostego kursor i składnia

zestaw wyników generowane przy otwarciu tego kursor obejmuje wszystkie wiersze i wszystkie kolumny w tabela.Można zaktualizować tego kursor , a wszystkie aktualizacje i usuwanie są reprezentowane w pobiera przeciwko tego kursor.FETCHNEXTjest dostępny do pobrania tylko ponieważ SCROLL nie została określona opcja.

USE AdventureWorks2008R2;
GO
DECLARE vend_cursor CURSOR
    FOR SELECT BusinessEntityID, Name, CreditRating FROM Purchasing.Vendor
OPEN vend_cursor
FETCH NEXT FROM vend_cursor;

B.Za pomocą zagnieżdżonego kursory do generowania danych wyjściowych raportów

W poniższym przykładzie pokazano, jak można zagnieżdżać kursory do produkcji złożonych raportów.Wewnętrzne kursor jest zadeklarowany dla każdego dostawcy.

USE AdventureWorks2008R2;
GO
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 BusinessEntityID, Name
FROM Purchasing.Vendor
WHERE PreferredVendorStatus = 1
ORDER BY BusinessEntityID;

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 AS pv
    INNER JOIN Production.Product AS v 
        ON pv.ProductID = v.ProductID AND
           pv.BusinessEntityID = @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;