Udostępnij za pośrednictwem


Zakres nazw kursor Transact-SQL

Microsoft SQL Server supports the GLOBAL and LOCAL keywords on the DECLARE CURSOR statement to define the scope of the cursor name.GLOBALNE określa globalne połączenia nazwa kursor.LOKALNE Określa, że nazwa kursor lokalnego do procedura składowana, wyzwalacza lub partia zawierających instrukcja DECLARE kursor.

Prior to Microsoft SQL Server version 7.0, the names of Transact-SQL cursors were global to the connection.Można wykonać jeden procedura składowana, która tworzy kursor, a następnie wywołać innej procedura składowana, która pobiera wiersze z tym kursora:

USE AdventureWorks2008R2;
GO
CREATE PROCEDURE OpenCrsr AS

DECLARE SampleCrsr CURSOR FOR
SELECT TOP (20)LastName
FROM Person.Person
WHERE LastName LIKE 'S%';

OPEN SampleCrsr;
GO

CREATE PROCEDURE ReadCrsr AS
FETCH NEXT FROM SampleCrsr
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT FROM SampleCrsr
END
GO

EXEC OpenCrsr; /* DECLARES and OPENS SampleCrsr. */
GO
EXEC ReadCrsr; /* Fetches the rows from SampleCrsr. */
GO
CLOSE SampleCrsr;
GO
DEALLOCATE SampleCrsr;
GO

Kursory lokalnych oferują ochrony ważnych kursory w procedur przechowywanych i wyzwalaczy.Globalne kursorów można odwoływać się poza procedura składowana lub wyzwalacz, w której zostały zgłoszone.W związku z tym mogą zostać przypadkowo zmienione przez instrukcji poza procedura składowana lub wyzwalacza.Kursory lokalne są bezpieczniejsze niż globalnego kursorów, ponieważ nie można się odwoływać poza procedura składowana, chyba że celowo przekazywana z powrotem do wywołującego jako parametr wyjściowy kursor.

Ponieważ globalnego kursorów można odwoływać się poza wyzwalacza lub procedura składowana, może mieć niezamierzone efekty uboczne, wpływających na innych sprawozdań.Przykładem jest procedura składowana, która tworzy globalnego kursora z nazwą xyz i pozostawia otwarte kursor po zakończeniu.Próba zadeklarowania inny kursor globalnym o nazwie xyz po wykonaniu procedura składowana nie powiedzie się ze zduplikowaną nazwę błędu.

kursory globalnym i lokalnym mają osobnej nazwy spacje, dlatego jest możliwe globalnego kursor i local kursor o tej samej nazwie w tym samym czas. Transact-SQL Instrukcji, które akceptuje parametr nazwa kursor obsługują także globalne słowo kluczowe do identyfikowania zakres nazwy.Jeśli nie określono GLOBALNEGO, a istnieją zarówno lokalne i globalne kursor z nazwą określoną przez parametr nazwa kursora, odwołuje się kursor lokalny.

Opcja bazy danych CURSOR_DEFAULT, zestaw instrukcja ALTER DATABASE kontroluje domyślne podjęte przez instrukcja DECLARE CURSOR, jeśli nie określono lokalnych ani GLOBAL.Bieżąca wartość dla opcji tej bazy danych jest przechowywany w sys.databases wykazu widoku.Jeśli wartość kolumna jest local_cursor_default w sys.databases Widok wykazu jest true, Transact-SQL kursory domyślnie lokalne.Jeśli opcja jest false, Transact-SQL kursory domyślny do globalnego.W SQL Server, opcja bazy danych sam domyślne na FALSE (GLOBAL) odpowiadający zachowanie wcześniejsze wersje SQL Server.

procedura składowana, że DECLARE i OTWARTYCH kursorów lokalnych można przekazać kursory do użytku przez wywołanie procedura składowana, wyzwalacza lub partia.Można to zrobić przy użyciu parametru WYJŚCIOWEGO zdefiniowane przy użyciu nowego typu danych RÓŻNICOWANIA kursora.Kursor zmiennych można używać tylko jako parametry wyjściowe.Nie można używać parametrów wejściowych.Po zakończeniu procedura składowana do przekazania w parametru WYJŚCIOWEGO, kursor musi być otwarty.Zmienne lokalne mogą być także zadeklarowana ze nowy typ danych kursor do przechowywania odniesienie do kursor lokalnego.

USE AdventureWorks2008R2;
GO
/* Create a procedure with a cursor output parameter. */
CREATE PROCEDURE OpenCrsr @OutCrsr CURSOR VARYING OUTPUT AS

SET @OutCrsr = CURSOR FOR
SELECT TOP (20) LastName
FROM Person.Person
WHERE LastName LIKE 'S%';

OPEN @OutCrsr;
GO

/* Allocate a cursor variable. */
DECLARE @CrsrVar CURSOR;

/* Execute the procedure created earlier to fill
  the variable. */
EXEC OpenCrsr @OutCrsr = @CrsrVar OUTPUT;

/* Use the variable to fetch the rows from the cursor. */
FETCH NEXT FROM @CrsrVar
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT FROM @CrsrVar
END;

CLOSE @CrsrVar;

DEALLOCATE @CrsrVar;
GO

Baza danych API obsługuje parametry wyjściowe kursor na procedury przechowywane.procedura składowana, zawierającego kursor wyjściowe parametru nie można wykonać bezpośrednio z bazy danych funkcja interfejsu API.Te procedura składowana mogą być wykonywane tylko z innej procedura składowana, wyzwalacza, lub Transact-SQL partia lub script.

GLOBALNE kursor jest dostępna, dopóki nie zostanie jawnie deallocated lub połączenie zostanie zamknięte.Kursory lokalnych niejawnie są wtedy, kiedy kończy się procedura składowana, wyzwalacza lub partia, w którym zostały utworzone, chyba że kursor została przekazana jako parametr.Kursor lokalny zostanie następnie być niejawnie wtedy, kiedy parametr lub zmienna odwołującym się kursor w kodzie, który wywołał procedurę wykracza poza zakres.