Udostępnij za pośrednictwem


Scope of Transact-SQL Cursor Names

Microsoft SQL Server obsługuje GLOBAL i LOCAL słowa kluczowe w instrukcja DECLARE kursor w celu zdefiniowania zakres nazwa kursor.GLOBAL Określa, że nazwa kursor jest globalny do połączenia.LOCAL Określa, że nazwa kursor LOCAL procedura przechowywana, wyzwalacza lub wsadowym zawierającym instrukcja DECLARE kursor.

Prior to Microsoft SQL Server version 7.0, the names of Transact-SQL cursors were global to the connection.Użytkownik może wykonać jednej procedura przechowywana, która tworzy kursor, a następnie wywołać innej procedura przechowywana, która pobiera wierszy z tym kursora:

USE AdventureWorks;
GO
CREATE PROCEDURE OpenCrsr AS

DECLARE SampleCrsr CURSOR FOR
SELECT TOP (20)LastName
FROM Person.Contact
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 lokalnego oferują ochrony ważnych kursorów w procedurach przechowywanych i wyzwalaczy.Kursory globalnych można odwoływać się poza procedura przechowywana lub uruchamiać, w którym zostały zgłoszone.W rezultacie mogą zostać przypadkowo zmienione przez instrukcji procedura przechowywana lub wyzwalacza.Kursory lokalnych są bardziej bezpieczne niż globalne kursory ponieważ one nie mogą odwoływać się poza procedura przechowywana, chyba że celowo przekazane do obiektu wywołującego jako parametr wyjściowy kursor.

Ponieważ poza procedurą przechowywaną lub wyzwalacza można odwoływać się do globalnego kursory, mogą mieć niezamierzone skutki uboczne, mające wpływ na inne instrukcje.Przykładem jest procedura przechowywana, która tworzy globalny kursor z nazwą xyz i pozostawia kursor Otwórz po zakończeniu.Podjęto próbę zadeklarować inny kursor globalnym o nazwie xyz po procedura przechowywana zakończone kończy się niepowodzeniem z błędem duplikat nazwy.

Kursory globalnym i lokalnym mają spacje oddzielnej nazwy, dzięki czemu może być kursor globalnego i lokalnego kursor o takiej samej nazwie w tym samym czasie.The Transact-SQL statements that accept a kursor name parameter also support the GLOBAL keyword to identify the zakres of the name. Jeśli GLOBAL nie została określona jest zarówno lokalne i globalne kursor z nazwą określoną przez parametr nazwa kursora, odwołuje się do lokalnego kursora.

Opcja CURSOR_DEFAULT, bazy danych, ustawianie przy użyciu instrukcja ALTER DATABASE kontroluje domyślny, podejmowanych przez instrukcja DECLARE kursor, jeśli określono LOCAL ani GLOBAL.Bieżąca wartość dla opcji tej bazy danych jest przechowywany w sys.Databases Służy do wyświetlania katalogu. W przypadku wartości kolumna local_cursor_default in the sys.Databases wykazu widok jest wartość true, Transact-SQL Domyślnie kursory lokalnego. Jeśli opcja jest FAŁSZ, Transact-SQL kursory Domyślnie globalna. W SQL Server, w bazie danych sam opcji ustawień domyślnych na wartość FAŁSZ (GLOBAL) do zachowania wcześniejszych wersji programu SQL Server.

procedura przechowywana, że DECLARE i OPEN kursory lokalnych mogą być przekazywane kursory do użytku przez wywołanie procedura przechowywana, wyzwalacza lub partia.Można to zrobić za pomocą parametru WYJŚCIOWEGO zdefiniowane przy użyciu nowego typu danych RÓŻNICOWANIA kursor.Kursor zmienne mogą być używane tylko jako parametry OUTPUT.Nie można ich używać parametrów wejściowych.Po zakończeniu procedura przechowywana do przekazania po powrocie do parametru WYJŚCIOWEGO kursor musi być otwarty.Zmienne lokalne mogą być także zadeklarowana ze nowy typ danych kursor do przechowywania odwołanie do lokalnego kursor.

USE AdventureWorks;
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.Contact
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

Interfejsy API bazy danych nie obsługują parametry wyjściowe kursor na procedury przechowywane.Procedura przechowywana, zawierającego kursor wyjściowe parametru nie można wykonać bezpośrednio z bazy danych funkcja interfejsu API.Te procedura przechowywana mogą być wykonywane tylko w programie innej procedura przechowywana, wyzwalacza, lub Transact-SQL programu wsadowego lub skryptu.

Kursor GLOBAL jest dostępna, dopóki nie zostanie on jawnie deallocated lub połączenia.Kursory LOCAL są niejawnie przydziałów, gdy zakończy procedura przechowywana, wyzwalacza lub partia, w którym zostały utworzone, chyba że kursor została przekazana jako parametr.Kursor lokalny będą następnie być niejawnie przydziałów, gdy parametr lub zmienna odwoływania się do kursora w kodzie, który wywołał procedurę wykracza poza zakres.